利用子问题思路解决二叉树相关Oj题

目录

        检查两棵树是否相同:题目链接

         判断另⼀棵树的子树是否存在:题目链接

        翻转二叉树:题目链接

        判断⼀棵二叉树是否是平衡二叉树:题目链接

        判断对称二叉树:题目链接

        二叉树的层序遍历

        二叉树的分层遍历:题目链接

        判断一棵树是否为完全二叉树:


        检查两棵树是否相同:题目链接

         代码实现:

 public boolean isSameTree(TreeNode p, TreeNode q) {if(p == null && q != null || q == null && p != null) {return false;}if(p == null && q == null) {return true;}if(p.val != q.val) {return false;}return isSameTree(q.left,p.left) && isSameTree(q.right,p.right);}

        题解思路:

        首先,第一个 if 判断两个根结点是否为一个为空,一个不为空,如果是的话说明以当前根结点p和q肯定不是相同的树,直接返回false。

        其次,到了第二个 if 判断,p和q只剩下两种情况,要么都为空,要么都不为空,第二个 if 判断当前结点是否都为空的情况,如果是,说明是以当前 p 和 q 结点作为根的树是一样的,返回true。

        最后,剩下p 和 q 都不为空的情况,如果 p 和 q 当中 的值不一样,返回false;如果p 和 q 里的值相同,执行到最后一句时,如果当前的 根左子树 和右子树相同的话,就会返回true了。

        

         判断另⼀棵树的子树是否存在:题目链接

         代码实现:

 public boolean isSubtree(TreeNode root, TreeNode subRoot) {if(root == null) {return false;}if(isSameTree(root,subRoot)) {return true;}if(isSubtree(root.left,subRoot)) {return true;}if(isSubtree(root.right,subRoot)) {return true;}return false;}public boolean isSameTree(TreeNode p, TreeNode q) {if(p == null && q != null || q == null && p != null) {return false;}if(p == null && q == null) {return true;}if(p.val != q.val) {return false;}return isSameTree(q.left,p.left) && isSameTree(q.right,p.right);}

        题解思路:

        首先,判断当前会移动的结点root,如果是空,返回false;

        第一个 if 我们利用了上题的代码来判断当前两棵树是否一样,一样则返回true;

        第二个 if 和 第三个 if 分别往 当前结点的 左子树 和右子树 走,并分别判断当前的root和subRoot颗树是否相同 。

        最后,如果都没有找到,只能返回false。

        

        翻转二叉树:题目链接

        代码实现:

public TreeNode invertTree(TreeNode root) {if(root == null) {return null;}TreeNode num = root.left;root.left = root.right;root.right = num;invertTree(root.left);invertTree(root.right);return root;}

        题解思路:

        只要把每个结点的左子树和右子树交换就可以了。

        

        判断⼀棵二叉树是否是平衡二叉树:题目链接

         代码实现:

public boolean isBalanced(TreeNode root) {if(root == null) {return true;}int left = getHight(root.left);int right = getHight(root.right);return Math.abs(left-right) <= 1 && isBalanced(root.left) && isBalanced(root.right);}public int getHight(TreeNode root) {if(root == null) {return 0;}int left = getHight(root.left);int right = getHight(root.right);return left > right ? left + 1 : right + 1; }

        题解思路:

        首先,如果当前结点为空,也认为是平衡二叉树;

        其次,分别求得当前结点的左子树 和 右子树 的高度。

        如果当前结点的左子树和右子树高度差 不大于 1 ,并且,当前结点的左子树 是平衡二叉树,结点的右子树也是平衡二叉树,才能说明这棵树为平衡二叉树。

        

        判断对称二叉树:题目链接

         代码实现:

public boolean isSymmetric(TreeNode root) {if(root == null) {return true;}return isSymmetrichild(root.left,root.right);}public boolean isSymmetrichild(TreeNode leftroot,TreeNode rightroot) {if(leftroot == null && rightroot != null || leftroot != null && rightroot == null) {return false;}if(leftroot == null && rightroot == null) {return true;}if(leftroot.val != rightroot.val) {return false;}return isSymmetrichild(leftroot.left,rightroot.right) &&isSymmetrichild(leftroot.right,rightroot.left);}

        题解思路:

        首先,如果根结点为空,也当作是平衡二叉树。

        我们创建另外的方法 isSymmetrichild 方法来判断平衡二叉树,把根结点的左子树的根和右子树的根传过去当作参数。

        判断逻辑先从当前两个结点是否为一空一不空,再判断是否都为空,最后剩下就是两个结点不为空了,再判断里面的值。

        到最后,在当前两个结点的值相同的情况下,如果leftroot的左子树 与 rightroot的右子树相同,并且leftroot的右子树 与 rightroot的左子树相同,才能说明当前的两个结点是对称的树。

        

        

        二叉树的层序遍历

         这是为下面的二叉树的分层遍历这道题作个铺垫理解,层序遍历也就是要把二叉树的数据从根节点开始,从上到下,从左到右依次遍历。

        代码实现:

 public void CengXu(TreeNode root) {if(root == null) {return;}Queue<TreeNode> que = new LinkedList<>();que.offer(root);while( !que.isEmpty()) {TreeNode cur = que.poll();System.out.print(cur.val+" ");if(cur.left != null) {que.offer(cur.left);}if(cur.right != null) {que.offer(cur.right);}}}

         分析

        我们利用了一个队列,先把根节点放到队列里,然后再出队列用 cur 承接并打印数据,再判断当前的 cur 得到的 结点 左和右结点是否不为空,不为空则把 当前 cur 结点的左孩子和右孩子放到队列里。再重复此操作。

        当最后队列为空时,说明已经分层遍历完了,代码结束。

        

        二叉树的分层遍历:题目链接

         代码实现:

public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> list = new ArrayList<>();if(root == null) {return list;}Queue<TreeNode> que = new LinkedList<>();que.offer(root);while( !que.isEmpty()) {List<Integer> num = new ArrayList<>();int size = que.size();while(size != 0) {TreeNode cur = que.poll();num.add(cur.val);if(cur.left != null) {que.offer(cur.left);}if(cur.right != null) {que.offer(cur.right);}size--;}list.add(num);}return list;}

        题解思路

        在 二叉树的层序遍历 的基础上,这是把树的每一层都分开来 一层一层遍历,所以初始化了 list 作为 结果的 总体,而 num 作为 每一层 的数据给到 list 。

        我们可以定义一个 size 接收 每次 while(size != 0)结束后 队列里的个数,从而得到下一层的数据,以此类推。

        并且每一次 while(size != 0)循环结束后把该层的数据放到 list 里。

        

        判断一棵树是否为完全二叉树:

        代码实现

 public boolean gettrue(TreeNode root) {if(root == null) {return true;}Queue<TreeNode> que = new LinkedList<>();que.offer(root);while(!que.isEmpty()) {TreeNode cur = que.poll();if(cur != null) {que.offer(cur.left);que.offer(cur.right);}else {break;}}while(!que.isEmpty()) {TreeNode cur = que.peek();if(cur == null) {que.poll();}else {return false;}}return true;}

        题解思路

        首先,与二叉树的层序遍历类似,把结点放进队列里,不同的是,不用判断当前的 cur 左子树结点 和右子树结点是否为空了,而是判断当前 cur 本身,cur如果不为空 则把 cur的左子树结点 和右子树结点都放到队列里,null 也是可以放到队列里的。当弹出结点元素时遇到 null 则 跳出循环。

        最后的循环可以判断是否为二叉树,因为前面把所有的结点包括 null 都放到队列里了,如果是完全二叉树,当第一个循环结束break后,队列里剩下的都应该是 null ,如果不是完全二叉树,则会break后在队列里留了结点元素。

        所以,最后的循环判断如果遇到了结点元素,直接返回false。

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

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

相关文章

腾讯云大数据套件TBDS与阿里云大数据能力产品对比

前言 博主在接触大数据方向研究的时候是在2016年,那时候正是大数据概念非常火热的一个时间段,最著名的Google的3篇论文。Google FS、MapReduce、BigTable,奠定了大数据框架产品的基础。Google文件系统,计算框架和存储框架。往后所有的大数据产品和过程域无一不是在三个模块…

前端如何判断浏览器 AdBlock/AdBlock Plus(最新版)广告屏蔽插件已开启拦截

2个月前AdBlock/AdBlock Plus疑似升级了一次 因为自己主要负责面对海外的用户项目&#xff0c;发现以前的检测AdBlock/AdBlock Plus开启状态方法已失效了&#xff0c;于是专门研究了一下。并尝试了很多方法。 已失效的老方法 // 定义一个检测 AdBlock 的函数 function chec…

2.11寒假作业

web&#xff1a;[SWPUCTF 2022 新生赛]js_sign 打开环境是这样的&#xff0c;随便输入进行看看 提示错误&#xff0c;看源码其中的js代码 这个代码很容易理解&#xff0c;要让输入的内容等于对应的字符串&#xff0c;显然直接复制粘贴是错的 这串字符看起来像是base64加密&…

c# http

C#代码 客户端&#xff1a; NETCore提供了三种不同类型用于生产的REST API&#xff1a; HttpWebRequest;WebClient;HttpClient HttpWebRequest 这是.NET创建者最初开发用于使用HTTP请求的标准类。使用HttpWebRequest可以让开发者控制请求/响应流程的各个方面&#xff0c;如…

哈希表实现(C++实现)

目录 1.哈希概念 2.哈希冲突 3.哈希函数 4.哈希冲突解决 闭散列 —— 开放定址法 线性探测 二次探测 开散列 —— 链地址法&#xff08;拉链法、哈希桶&#xff09; 5.哈希表的闭散列实现 哈希表的结构 哈希表的大小和扩容 哈希表的插入 哈希表的查找 哈希表的删除…

开箱即用:一个易用的开源表单工具!

随着互联网的普及&#xff0c;表单应用场景越来越广泛&#xff0c;从网站注册、调查问卷到考试测评&#xff0c;无处不在。传统的表单制作方式需要一定的代码基础&#xff0c;对于不懂编程的小伙伴来说&#xff0c;无疑是一道门槛。 今天&#xff0c;给大家分享一款开源的表单…

牛客 BM1: 反转链表

目录 一、题目 二、C解题程序框架 1. 结构体定义 2. 类定义 3. 输入输出说明 三、链表指针 1. 链表指针的基本概念 2. 链表指针的常见操作 1. 遍历链表 2. 插入节点 3. 删除节点 3. 链表指针操作的注意事项 4. 总结 四、解题 方法一&#xff1a;迭代法 方法二&…

MIT开源7B推理模型Satori:用行动思维链进行强化学习,增强自回归搜索

自OpenAI的o1发布以来&#xff0c;研究社区为提升开源LLM的高级推理能力做出了诸多努力&#xff0c;包括使用强大的教师模型进行蒸馏、蒙特卡洛树搜索&#xff08;MCTS&#xff09;以及基于奖励模型的引导搜索等方法。 本研究旨在探索一个新的研究方向&#xff1a;使LLM具备自回…

Kubernetes控制平面组件:etcd(一)

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;kubectl 和 …

Django在终端创建项目(pycharm Windows)

1.选择目录 选择或新建一个文件夹&#xff0c;作为项目保存的地方 2.右键在终端打开 3.确定django-admin.exe安装位置 找到自己安装django时&#xff0c;django-admin.exe安装的位置&#xff0c;例如 4.运行命令 使用django-admin.exe的绝对路径&#xff0c;在刚才打开的终端…

e2studio开发RA2E1(9)----定时器GPT配置输入捕获

e2studio开发RA2E1.9--定时器GPT配置输入捕获 概述视频教学样品申请硬件准备参考程序源码下载新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user_uart_callback…

【PS 2022】Adobe Genuine Service Alert 弹出

电脑总是弹出Adobe Genuine Service Alert弹窗 1. 不关掉弹窗并打开任务管理器&#xff0c;找到Adobe Genuine Service Alert&#xff0c;并右键进入文件所在位置 2 在任务管理器中结束进程并将文件夹中的 .exe 文件都使用空文档替换掉 3. 打开PS不弹出弹窗&#xff0c;解决&a…

RoboGrasp:一种用于稳健机器人控制的通用抓取策略

25年1月来自北京大学和哈佛大学的论文“RoboGrasp: A Universal Grasping Policy for Robust Robotic Control”。 模仿学习和世界模型在推进通用机器人学习方面显示出巨大的潜力&#xff0c;而机器人抓取仍然是实现精确操控的关键挑战。现有方法通常严重依赖机械臂状态数据和…

接口测试Day12-持续集成、git简介和安装、Gitee远程仓库、jenkins集成

持续集成 概念&#xff1a; 团队成员将自己的工作成果&#xff0c;持续集成到一个公共平台的过程。成员可以每天集成一次&#xff0c;也可以一天集成多 次。 相关工具&#xff1a; 本地代码管理&#xff1a;git远程代码管理&#xff1a;gitee(国内)、github(国外)、gitlib(公司…

C语言基础11:分支结构以及if的使用

C语言基础 内容提要 分支结构 条件判断用if语句实现分支结构 分支结构 问题抛出 我们在程序设计往往会遇到如下问题&#xff0c;比如下面的函数的计算&#xff1a; y { 1 / x 当 x ≠ 0 时 10000 当 x 0 时 y \begin{cases} 1/x \quad当x\neq0时\\ \\ 10000 \quad当x0…

81页精品PPT | 华为流程与信息化实践与架构规划分享

华为流程与信息化实践与架构规划分享主要围绕华为在业务流程与信息化建设方面的经验、企业架构规划方法以及企业数字化转型路径展开。华为通过持续的业务变革和信息化建设&#xff0c;从本土企业逐步发展为国际化、全球化企业&#xff0c;其管理体系以持续创新和世界级管理体系…

【最大开支——优先队列,计算增量】

题目 代码 #include <bits/stdc.h> using namespace std; using ll long long; using pll pair<ll, int>; #define x first #define y second const int N 1e5 10; int n, m; int k[N], b[N], cnt[N]; priority_queue<pll, vector<pll>> pq; // d…

174款复古Y2K酸性镀铬银色金属多样化锁链链条铁链几何抽象PNG免扣元素设计套装 Studio 2AM - Chains

Chains 是以链条纹理为主题的设计元素的集合。以 PNG 格式以高分辨率创建&#xff0c;但文件大小较小&#xff0c;因此不会占用硬盘空间。“Chains” 是以 PNG 格式提供的以链条为主题的设计元素的高分辨率集合。该套装包括 174 个银色、生锈和彩虹色材料的链条纹理&#xff0c…

将 AMD Zynq™ RFSoC 扩展到毫米波领域

目录 将 AMD Zynq™ RFSoC 扩展到毫米波领域Avnet XRF RFSoC 系统级模块适用于 MATLAB 的 Avnet RFSoC Explorer 工具箱5G mmWave PAAM 开发平台突破性的宽带毫米波波束成形特征&#xff1a;OTBF103 Mathworks Simulink 模型优化毫米波应用中的射频信号路径 用于宽带毫米波上/下…

IDEA中打包maven项目,提示Compilation failure

使用IDEA打包maven项目&#xff0c;报错如下&#xff1a; 解决方法&#xff1a;在pom文件中指定JDK版本即可 <properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target> </propertie…