二叉树OJ题(C++实现)

news2024/11/15 12:58:40

文章目录

    • 1.二叉树创建字符串
    • 2. 二叉树的最近公共祖先
    • 3.二叉搜索树与双向链表
    • 4.从前序与中序遍历序列构造二叉树

1.二叉树创建字符串

二叉树的层序遍历 OJ连接

主要思路是借助一个队列,将每一层的数据以size统计,当size为0时说明该层数据已经输入完,将这一层的数据传入vector中,再通过push_back 传入 vector< vector< int >中



class Solution {
public:
   
    string tree2str(TreeNode* root) {
      
        if(root==NULL)
        {
            return "";
        }
         string s;
        //to_string 将任意类型转换为字符串
         s=to_string(root->val);
         //只有左右子树都为空时 左子树才不加括号
        if(root->left==NULL&&root->right==NULL)
        {
             //;
        }
        else 
        {
        s+='(';
        s+= tree2str(root->left);
        s+=')';
        }
        //若右子树为空 ,则不加括号
     if(root->right!=NULL)
     {
         s+='(';
         s+=  tree2str(root->right);
         s+=')';
     }
        return s;
    }
};

2. 二叉树的最近公共祖先

二叉树的最近公共祖先OJ连接



共分为三种情况

第一种情况

寻找节点7与0的公共祖先为 根节点3
节点7在根的左子树,而节点0在根的右子树

若一个在根的左子树,一个在根的右子树 , 则根就为公共祖先


第二种情况
以左子树为例

节点7与节点4属于根的左子树
节点7与节点4的最近公共祖先为 他们共同的父节点2


在这里插入图片描述
若两个节点都在根的左子树,则递归根的左子树的节点为根,判断两个节点是否为根的左右子树,直到寻找到


第三种情况

节点5与节点4的最近公共祖先是节点5
节点5与节点4都属于根的左子树
若两个节点都在根的左子树,则递归根的左子树的节点为根,当这个根为两个节点其中一个时,则这个节点就为公共祖先


由于第二种和第三种情况,节点都在左子树上,所以可以看作是一种情况


class Solution {
public:
bool istree(TreeNode*root,TreeNode*x)
{
      if(root==NULL)
      {
          return false;
      }
      if(root==x)
      {
          return true;
      }
      return istree(root->left,x)|| istree(root->right,x);
}
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
          if(root==NULL)
          {
              return NULL;
          }
          //若p/q节点有一个节点为根节点,则最近公共祖先为根节点
          if(p==root||q==root)
          {
              return root;
          }
          
           bool pleft=istree(root->left,p);
           bool pright=!pleft;
           bool qleft=istree(root->left,q);
           bool qright=!qleft;
           //两个节点分别在左右子树上
           if( (pleft&&qright)|| (pright&&qleft))
           {
               return root;
           }
           //两个节点都在根的左子树上,则递归左子树
           else if(pleft&&qleft)
           {
                return lowestCommonAncestor(root->left,p,q);
           }
           //两个节点都在根的右子树上,则递归右子树
           else 
           {
              return lowestCommonAncestor(root->right,p,q);
           }
    }
};

3.二叉搜索树与双向链表

二叉搜索树与双向链表OJ连接


prev节点用于记录cur节点的上一个

当cur节点值为4时,prev=NULL,因为4属于双向链表第一个节点值 所以没必要链接
只需更新prev的值为cur值即可


prev值不为空时,将cur节点与prev节点进行连接,并更新prev节点值
prev->right=cur
cur->left=prev


class Solution {
  public:
  void inconvert(TreeNode*cur,TreeNode*&prev)
  //因为prev是要跟着cur进行变化的,所以使用引用
  {
	if(cur==nullptr)
	return ;
	inconvert(cur->left,prev);
	//cur出现的顺序就为中序
	if(prev)
	{
		prev->right=cur;
		cur->left=prev;
	}
	prev=cur;

	inconvert(cur->right,prev);

  }
    TreeNode* Convert(TreeNode* root) {
		TreeNode*prev=nullptr;//记录cur节点的上一个
       inconvert(root,prev);
	    TreeNode*head=root;
		//通过遍历左子树的方式找到第一个节点
		while(head&&head->left)
		{
			head=head->left;
		}
		return head;
    }
};


4.从前序与中序遍历序列构造二叉树


从前序与中序遍历序列构造二叉树OJ链接



创建root,并确定值为3
在中序数组中寻找 root值为3的节点 ,并标记其下标为rooti
再通过递归的方式分别创建root的left与root的right


同时每次都需要prev++,来确定新的根,
每次rooti都被赋值为inbegin,是为了中序数组的新区间内寻找到根


递归结束的判断条件

若rooti与inbegin都为数组中第一个数的下标时,
[inbegin, rooti-1] 即 [ 0,-1] 为不存在的区间
所以当 inbegin >inright时,就直接返回


class Solution {
public:
//prev为先序数组的下标
//inbeing与inend为 左右子树分割区间
    TreeNode*istree(vector<int>& preorder, vector<int>& inorder,int &prev,
    int inbegin,int inend)
    {
        //若rooti值与inbegin同时为第一个值,
        //则 [inegin,rooti-1]即 [0 ,-1]会报错
        if(inbegin>inend)
        {
            return nullptr;
        }
        //通过先序创建根节点
        TreeNode*root=new TreeNode();
        root->val=preorder[prev];
        //在中序数组中查找root对应的值
        int rooti=inbegin;
        while(rooti<=inend)
        {
            if(preorder[prev]==inorder[rooti])
            {
                break;
            }
            rooti++;
        }
        prev++;//由于是引用,前序的根也要跟着变化
        //分割左右子树区间
      // [inbegin rooti-1] rooti [rooti+1 inend]
        
      root->left=istree(preorder,inorder,prev,inbegin,rooti-1);
      root->right=istree(preorder,inorder,prev,rooti+1,inend);
      return root;


    }
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        int i=0;
           return  istree(preorder,inorder,i,0,inorder.size()-1);
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/453598.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity Physics2D 2d物理引擎游戏 笔记

2d 材质 里面可以设置 摩擦力 和 弹力 Simulated&#xff1a;是否在当前的物理环境中模拟&#xff0c;取消勾选该框类似于Disable Rigidbody&#xff0c;但使用这个参数更加高效&#xff0c;因为Disable会销毁内部产生的GameObject&#xff0c;而取消勾选Simulated只是禁用。…

详解C语言string.h中常用的14个库函数(四)

本篇博客会讲解最后4个函数&#xff0c;分别是memset, memcpy, memmove, memcmp。这4个函数开头都是mem&#xff0c;即memory&#xff08;内存&#xff09;的缩写。 memset void * memset ( void * ptr, int value, size_t num );memset可以用来设置内存中的值。该函数可以把从…

深度学习实战——循环神经网络(RNN、LSTM、GRU)

忆如完整项目/代码详见github&#xff1a;https://github.com/yiru1225&#xff08;转载标明出处 勿白嫖 star for projects thanks&#xff09; 目录 系列文章目录 一、实验综述 1.实验工具及内容 2.实验数据 3.实验目标 4.实验步骤 二、循环神经网络综述 1.循环神经…

【数据结构】第五章 树与二叉树

文章目录 知识体系5.1 树的基本概念5.1.1 树的定义5.1.2 基本术语5.1.3 树的性质 5.2 二叉树的概念5.2.1 二叉树的定义和主要特性5.2.2 二叉树的存储结构 5.3 二叉树的遍历和线索二叉树5.3.1 二叉树的遍历5.3.2 线索二叉树 5.4 树、森林5.4.1 树的存储结构5.4.2 树、森林与二叉…

uniapp踩坑之项目:各端条件编译

在 HBuilderX 中&#xff0c;ctrlalt/ 即可生成正确注释&#xff08;js&#xff1a;// 注释、css&#xff1a;/* 注释 */、vue/nvue模板&#xff1a; &#xff09;。 #ifdef&#xff1a;if defined 仅在某平台存在#ifndef&#xff1a;if not defined 除了某平台均存在%PLATFORM…

ARM busybox 的移植实战2

一、busybox 源码分析1 1、源码目录梳理 2、整个程序入口的确认 (1) 分析一个程序&#xff0c;不管多庞大还是小&#xff0c;最好的路线都是 按照程序运行时的逻辑顺序来。所以找到一个程序的入口至关重要。 (2) 学 C 语言的时候都知道&#xff0c;程序的主函数 main 函数就是…

机器学习算法 随机森林

文章目录 一、概述1.1 集成学习1.2 决策树1.3 随机森林 二、Sklearn中的随机森林2.1 分类树API2.2 参数 2.2 回归树API2.2.1 重要参数 2.3 随机森林调参 三、总结 一、概述 1.1 集成学习 多个模型集成成为的模型叫做集成评估器&#xff08;ensemble estimator&#xff09;&am…

车载软件架构——闲聊几句AUTOSAR BSW(二)

我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 我特别喜欢一个老话,来都来了。我觉得这就是松弛感,既然来了,就开心起来吧!松弛感来自于专注,焦虑不是靠克服的,是靠忘记的,当你很专注做一件事的时候…

HNCTF-re部分复现

目录 [HNCTF 2022 WEEK3]Help_Me! [HNCTF 2022 WEEK3]Whats 1n DLL? [HNCTF 2022 WEEK4]ez_maze 这几天在做HNCTF的week3&#xff0c;week4部分&#xff0c;学到了一些不知道的没接触过的东西&#xff0c;所以记录一下 [HNCTF 2022 WEEK3]Help_Me! 题目下载&#xff1a;下…

onnx笔记2:onnx操作实例

1. 介绍 本文以yolov5s模型,演示对yolov5s.onnx模型文件的读取,修改等操作 2. onnx操作 2.1 获取数据 (1) 案例1 :读取weights数据 比如获取yolov5s.onnx第一个Conv的weights数据。 点击左侧第一个Conv, 右侧INPUTS下面的W点开+号,可以看到该Conv的weight的name为m…

MySQL --- 主从复制、读写分离

一、MySQL主从复制 MySQL数据库默认是支持主从复制的&#xff0c;不需要借助于其他的技术&#xff0c;我们只需要在数据库中简单的配置即可。接下来&#xff0c;我们就从以下的几个方面&#xff0c;来介绍一下主从复制 1.1、介绍 MySQL主从复制是一个异步的复制过程&#xff0c…

linux 安装 oracle 11g

linux 安装 oracle 11g 1、下载oracle 11g (11.2.0.1.0)1.1、Oracle Database 11.2.0.1.01.2、Oracle Database Grid Infrastructure 11.2.0.1.01.3、客户端 2、安装文档3、安装前准备3.1、建立用户和用户组3.2、sysctl3.3、security limits3.4、其他设置3.5、创建安装目录3.6、…

SpringBootWeb请求响应

目录 前言 1. 请求 1.1 Postman 1.1.1 介绍 1.1.2 安装 1.2 简单参数 1.2.1 原始方式 1.2.2 SpringBoot方式 1.2.3 参数名不一致 小结 1.3 实体参数 1.3.1 简单实体对象 1.3.2 复杂实体对象 1.4 数组集合参数 1.4.1 数组 1.4.2 集合 1.5 日期参数 1.6 JSON参…

液压轴位置闭环控制(比例伺服阀应用)

液压阀的基础知识请参看下面的博客文章: PLC液压控制系列之比例流量阀结构分析_RXXW_Dor的博客-CSDN博客比例流量阀液压同步控制的PID闭环调节可以参看下面这篇博文三菱FX3U-PLC 前馈+PID闭环调节实现液压同步控制(比例换向阀)_RXXW_Dor的博客-CSDN博客液压控制系统在工业现…

plt got

小白垃圾笔记而已&#xff0c;不建议阅读。 本来是仅仅写的文字&#xff0c;因为我并没有调试出来&#xff0c;在群里问了师傅后才知道是因为我开起了 full Pelro保护。 按理说应该关闭的&#xff0c;或者开启部分也可以。gcc -z lazy -o test test.c // 部分开启, 即…

跨平台跨端的登录流程及其安全设计

跨平台跨端的登录流程及其安全设计 目录 跨平台跨端的登录流程及其安全设计 一、登录流程 1.1、登录流程时序图 1.2、三方App 登录 1.3、请求的路由守卫 二、注册流程 2.1、注册流程时序图 2.2、多因素认证 2.3、自动跳转登录页面 三、涉及的技术与安全 3.1、用户…

基于深度学习的图片上色(Opencv,Pytorch,CNN)

文章目录 1. 前言2.图像格式&#xff08;RGB&#xff0c;HSV&#xff0c;Lab&#xff09;2.1 RGB2.2 hsv2.3 Lab 3. 生成对抗网络&#xff08;GAN&#xff09;3.1 生成网络&#xff08;Unet&#xff09;3.2 判别网络&#xff08;resnet18&#xff09; 4. 数据集5. 模型训练与预…

OSCP-Medjed(重置用户密码、mysql写webshell、可写文件替换提权)

目录 扫描 FTP WEB 提权 扫描 FTP 尝试登录到FTP服务器,该服务器位于端口30021 使用Filezilla,并能够浏览文件。那里有一些配置文件,但找不到任何值得注意的东西,不能写入目录。

成长之路---C语言笔记(构造类型之字符数组及字符串函数)

决不要停止自学&#xff0c;也不要忘记&#xff0c;不管你已经学到了多少东西&#xff0c;已经知道了多少东西&#xff0c;知识和学问是没有止境的一鲁巴金 字符数组 字符数组就是用于存放字符型数据的数组。在C语言中&#xff0c;字符串是作为字符数组来处理的&#xff0c;没有…

redis设计与实现读书笔记(2)

今天看的是关于单机数据库&#xff0c;RDB持久化以及AOF持久化的内容。 关于单机数据库 1.默认数据库数量 redis的服务器默认是会创建16个数据库&#xff0c;每个客户端访问的时候都要指定自己的目标数据库。 select可以切换目标数据库。 注意事项 到目前为止&#xff0c…