Java LeetCode篇-二叉树经典解法(实现:判断平衡二叉树、找两个节点最近的祖先等)

🔥博客主页: 【小扳_-CSDN博客】
❤感谢大家点赞👍收藏⭐评论✍
 

 

文章目录

        1.0 平衡二叉树

        1.1 实现判断平衡二叉树的思路

        1.2 代码实现判断平衡二叉树

        2.0 二叉树的层序遍历

        2.1 实现二叉树层序遍历的思路 

        2.2 代码实现二叉树层序遍历

        3.0 二叉树的最近公共祖先

        3.1 实现二叉树的最近公共祖先的思路

        3.2 代码实现二叉树的最近公共祖先

        4.0 根据二叉树创建字符串

        4.1 实现根据二叉树创建字符串的思路

        4.2 代码实现根据二叉树创建字符串


        1.0 平衡二叉树

题目:

        给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:true

OJ链接:

110. 平衡二叉树

        1.1 实现判断平衡二叉树的思路

        具体思路为:只需要判断当前节点的左右子树最大深度差是否大于 1 即可。利用递归的方式,来获取当前节点的最大深度,利用该节点的深度与另一个兄弟节点进行比较,若差值的绝对值对于 1 时,说明不是平衡二叉树

        1.2 代码实现判断平衡二叉树

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public boolean isBalanced(TreeNode root) {recursion(root);return sign;}public boolean sign = true;public int recursion(TreeNode node) {if(node == null) {return 0;}int l = recursion(node.left);int r = recursion(node.right);if(l < r) {int temp = l;l = r;r = temp;}if(l - r > 1) {sign = false;}return l + 1;}
}

        2.0 二叉树的层序遍历

        给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]

OJ链接:

102. 二叉树的层序遍历

         2.1 实现二叉树层序遍历的思路 

        具体思路为:利用层序遍历来进行按照从上到下,从左到右的顺序来访问每一层的节点

        简单分析如何实现层序遍历:利用了队列的数据结构的特点,先进先出。那么先从根节点出发,将其压入队列中,接着判断从队列中弹出来的节点的左右孩子;若该节点的左孩子不为 null 时,将其压入队列中;若右孩子不为 null 时,将其压入队列中。循环往复,循环条件终止条件为:当队列为空时,说明已经把该树遍历完毕了。

        回来再来看,需要将不同层级的节点放到不同的容器中,那么就可以利用每一层节点的个数来实现将不同的层级的节点放到不同的容器中。简单来说,就是当前的层级有多少个节点数,然后将这些的节点收集到同一个容器中,实现该效果可以利用压入队列中的节点个数为循环条件,将其放到同一的容器中

        2.2 代码实现二叉树层序遍历

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public List<List<Integer>> levelOrder(TreeNode root) {if(root == null) {return new ArrayList();}List<List<Integer>> list = new ArrayList<>();LinkedList<TreeNode> queue = new LinkedList();queue.offer(root);while (!queue.isEmpty()) {List<Integer> list1 = new ArrayList<>();int size = queue.size();for (int i = 0; i < size; i++) {TreeNode poll = queue.poll();if (poll.left != null) {queue.offer(poll.left);}if (poll.right != null) {queue.offer(poll.right);}list1.add(poll.val);}list.add(list1);}return list;}
}

        3.0 二叉树的最近公共祖先

题目:

        给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

示例 1:

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出:3
解释:节点 5 和节点 1 的最近公共祖先是节点 3 。

OJ链接:

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

         3.1 实现二叉树的最近公共祖先的思路

        具体思路为:一般分为两种情况,

        第一种,p 直接就是 q 的祖先或者 q 直接就是 p 的祖先。

示例 2:

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出:5
解释:节点 5 和节点 4 的最近公共祖先是节点 5 。因为根据定义最近公共祖先节点可以为节点本身。

        这属于是第一种情况,节点 5 就是节点 4 的最近公共祖先。因此节点 5 必定在节点 4 之前,所以只要遍历找到节点 5 ,就可以直接返回该节点,不需要再遍历下去了。当且仅当一个节点不为 null ,另一个节点为 null 时,肯定属于第一种情况

        第二种,互不为对方的祖先。

示例 1:

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出:3
解释:节点 5 和节点 1 的最近公共祖先是节点 3 。

        这属于第二种情况,互不为对方的祖先。这也简单,只要通过递归来找到当前根节点的左右节点为 q 或者 p ,或者在当前的根节点中左右子树中可以找到的 q 或者 p 时,那么说明 q 与 p 同时都不为 null 时,当前的根节点就是他们最近的祖先节点。这就是属于第二种情况。

        3.2 代码实现二叉树的最近公共祖先

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root == p || root == null || root == q) {return root;}TreeNode left = lowestCommonAncestor(root.left,p,q);TreeNode right = lowestCommonAncestor(root.right,p,q);if(left != null && right != null) {return root;}return (left != null ? left : right);}
}

        4.0 根据二叉树创建字符串

题目:

        给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。

空节点使用一对空括号对 "()" 表示,转化后需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。

示例 1:

输入:root = [1,2,3,4]
输出:"1(2(4))(3)"
解释:初步转化后得到 "1(2(4)())(3()())" ,但省略所有不必要的空括号对后,字符串应该是"1(2(4))(3)" 。

OJ链接:

606. 根据二叉树创建字符串

        4.1 实现根据二叉树创建字符串的思路

        具体思路为:利用前序遍历得到的每一个节点的值拼接到可变字符串中,在拼接之前需要加上左括号,根节点开始从左子树遍历,若左子树遍历完,需要原路返回,判断当前节点的右子树有无节点,若有节点,则发生的是子问题过程了;若没有节点了,最后需要在可变中字符串拼接上右括号。

        4.2 代码实现根据二叉树创建字符串

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public String tree2str(TreeNode root) {recursion(root);return  string.substring(1,string.length()-1);}public StringBuilder string = new StringBuilder();public void recursion(TreeNode node) {string.append("(");string.append(node.val);if (node.left != null) {recursion(node.left);}else if(node.right != null) {string.append("()");}if (node.right != null) {recursion(node.right);}string.append(")");}   
}

 

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

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

相关文章

苹果app应用ipa文件程序开发后如何运行到苹果iOS真机上测试?

在苹果应用程序开发过程中&#xff0c;将app安装于真机进行测试是一个不可或缺的步骤&#xff0c;它可以帮助你检测app在实际设备上的性能表现及存在的潜在问题。这篇文章将详细阐述如何将开发好的苹果app&#xff08;.ipa文件&#xff09;安装到真机上进行测试。 图片来源&…

文心一言 VS 讯飞星火 VS chatgpt (155)-- 算法导论12.3 2题

二、用go语言&#xff0c;假设通过反复向一棵树中插人互不相同的关键字来构造一棵二叉搜索树。证明&#xff1a;在这棵树中查找关键字所检查过的结点数目等于先前插入这个关键字所检查的结点数目加 1。 文心一言&#xff1a; 为了证明这个结论&#xff0c;我们可以使用二叉搜…

VisualSVN Server的安装全过程

目录 背景: 安装过程&#xff1a; 步骤1&#xff1a; 步骤2&#xff1a; 步骤3&#xff1a; 步骤4&#xff1a; 步骤5&#xff1a; 安装出现的bug&#xff1a; 问题: 解决办法: 总结: 背景: VisualSVN Server 是一款免费的 SVN (Subversion) 服务器软件&#xff0c…

2创建工程及点灯

1:软件安装&#xff1a; 1关注公众号“纸飞资”&#xff0c;键盘输入keil“”,按照文章要求安装编译软件 2芯片安装&#xff1a; 方式一&#xff1a;离线安装。去Keil公司官网的器件支持包下载页面选择对应的公司及器件型号&#xff0c;然后在Device Family Pack文本框中点击…

Python异常、模块和包

Python异常、模块和包 1.了解异常2.异常的捕获方法3.异常的传递4.Python模块5.Python包 1.了解异常 1.1什么是异常 当检测到一个错误是&#xff0c;Python解释器就无法继续执行了&#xff0c;发而出现了一些错误提示&#xff0c;这就是所谓的“异常”&#xff0c;也就是我们常…

【开源软件】最好的开源软件-2023-第26名 Accelerate

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…

【精选】小白是如何挖漏洞的(技巧篇)

目录&#xff1a; 怎么找漏洞 找到后如何挖漏洞 关于通杀漏洞N day漏洞的挖掘 漏洞如何提交 每小结都有提供对应的案例&#xff0c;简直不要太nice&#xff01; 这个月的SRC活动也快开始了&#xff0c;看到群里的小伙伴在问如何找漏洞&#xff0c;SQL注入的漏洞咋找&#x…

慢SQL诊断

最近经常遇到技术开发跑来问我慢SQL优化相关工作&#xff0c;所以干脆出几篇SQL相关优化技术月报&#xff0c;我这里就以公司mysql一致的5.7版本来说明下。 在企业中慢SQL问题进场会遇到&#xff0c;尤其像我们这种ERP行业。 成熟的公司企业都会有晚上的慢SQL监控和预警机制。…

思福迪运维安全管理系统 test_qrcode_b RCE漏洞复现

0x01 产品简介 思福迪运维安全管理系统是思福迪开发的一款运维安全管理堡垒机。 0x02 漏洞概述 由于思福迪运维安全管理系统 test_qrcode_b路由存在命令执行漏洞&#xff0c;攻击者可通过该漏洞在服务器端任意执行代码&#xff0c;写入后门&#xff0c;获取服务器权限&#…

【Docker】vxlan的原理与实验

VXLAN&#xff08;Virtual eXtensible Local Area Network&#xff0c;虚拟可扩展局域网&#xff09;&#xff0c;是一种虚拟化隧道通信技术。它是一种Overlay&#xff08;覆盖网络&#xff09;技术&#xff0c;通过三层的网络来搭建虚拟的二层网络。 VXLAN介绍 VXLAN是在底层…

【智能家居】八、监控摄像采集、人脸识别比对进行开门功能点

一、使用 fswebcam 测试 USB 摄像头 二、根据demo来实现功能点 三、功能点编写编译运行实现 四、mjpg实现监控识别 五、V4L2 视频设备 Linux 内核模块的一部分 一、使用 fswebcam 测试 USB 摄像头 a. 安装 fswebcam orangepiorangepi:~$ sudo apt update orangepiorangepi:~…

SSL证书可以有效避免劫持和钓鱼攻击

SSL证书对抗劫持和钓鱼攻击起到重要作用。通过使用SSL证书&#xff0c;网站可以防止黑客篡改网站内容或欺骗用户&#xff0c;确保用户所看到的是真实的网站信息&#xff0c;而不是被篡改的内容或诱导性的信息。这有助于保护用户的隐私和安全&#xff0c;并建立用户对网站的信任…

LeetCode008之字符串转换整数 (相关话题:状态机)

题目描述 请你来实现一个 myAtoi(string s) 函数&#xff0c;使其能将字符串转换成一个 32 位有符号整数&#xff08;类似 C/C 中的 atoi 函数&#xff09;。 函数 myAtoi(string s) 的算法如下&#xff1a; 读入字符串并丢弃无用的前导空格检查下一个字符&#xff08;假设还…

一天搞定jmeter入门到入职全套教程之Jmeter分布式测试

随着并发量的增大&#xff0c;一台机器就不能满足需求了&#xff0c;所以我们采用分布式&#xff08;Master-Slaver&#xff09;的方案去执行高并发的测试 注意事项&#xff1a; Master机器一般我们不执测试&#xff0c;所以可以拿一台配置差些的机器&#xff0c;主要用来采集…

c 语言 堆的解析(自我理解)!!!堆排序,建堆

目录 1.堆是什么&#xff1f; 2.堆的实现和接口。&#xff08;小堆&#xff09; 1.头文件 2.初始化 3.摧毁 4.向上调整&#xff08;重点&#xff09; 5.向下调整&#xff08;重点&#xff09; 6.插入&#xff08;重点&#xff09; 7.删除&#xff08;重点&#xff09; …

Linux---虚拟机软件

1. 虚拟机软件的介绍 它是能够虚拟出来计算机的一个软件。 常用虚拟机软件: VmwareVirtualBox 说明: 只有安装了虚拟机软件才可以创建虚拟机&#xff0c;当然通过虚拟机软件还可以创建多个虚拟机。 2. 虚拟机的介绍 就是模拟一个真实的计算机&#xff0c;好比一个虚拟的…

go学习之反射知识

反射 文章目录 反射1、反射的使用场景1&#xff09;结构体标签的应用2&#xff09;使用反射机制编写函数的适配器&#xff08;桥连接&#xff09; 2、反射的基本介绍-1.基本介绍-2.反射的图解-3.反射重要的函数和概念 3.反射快速入门-1.请编写一个函数&#xff0c;演示对&#…

【C进阶】C程序是怎么运作的呢?-- 程序环境和预处理(下)

前言&#xff1a; 这是程序环境和预处理的下半篇文章。至此&#xff0c;关于c语言知识点:从编译到运行的过程已讲解完毕。传送&#x1f6aa;&#xff0c;上半篇&#xff1a; http://t.csdnimg.cn/hvxmr 本章涉及的知识点&#xff1a; 宏和函数对比、命名约定、#undef、命令行定…

C语言—每日选择题—Day46

第一题 1. 下列程序段的输出结果是&#xff08;&#xff09; #include <stdio.h> int main() {int x 1,a 0,b 0;switch(x) {case 0: b;case 1: a;case 2: a;b;}printf("a%d,b%d\n", a, b);return 0; } A&#xff1a;a2,b1 B&#xff1a;a1,b1 C&#xf…

JVM面试

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.JVM 的整体结构2.类加载做了哪些事情?类加载器有哪些&#xff1f;双亲委派和沙箱安全 3.Java虚拟机栈是什么4.方法区的理解HotSpot 中方法区的演进方法区的内部结…