二叉树经典算法题目

news/2024/5/6 7:43:20/文章来源:https://blog.csdn.net/qq_42575907/article/details/128435572

1.二叉树的前中后序遍历(简单)

省略

2.二叉树的深度(简单)

输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。

例如:

给定二叉树 [3,9,20,null,null,15,7]

    3/ \9  20/  \15   7

返回它的最大深度 3 。

思路:递归,当前数的深度等于左子数和右子树其中最大深度再加1

代码:

class Solution {public int maxDepth(TreeNode root) {if (root==null){return 0;}return Math.max(maxDepth(root.right)+1,maxDepth(root.left)+1);}
}

3.层序遍历的应用

层序遍历思路:

使用一个队列,最开始先把root放进队列,然后弹出,打印,把左右子节点放入队列,周而复始,直到队列为空。

代码:

class Solution {public void levelOrder(TreeNode root) {LinkedList<TreeNode> quene = new LinkedList();while(quene.size() != 0) {TreeNode value = quene.poll();// 打印操作//...if(value.left != null){quene.add(value.left);}if(value.right != null){quene.add(value.right);}}}
}

3.1 二叉树的层平均值(简单)

给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。

示例 1:

img

输入:root = [3,9,20,null,null,15,7]
输出:[3.00000,14.50000,11.00000]
解释:第 0 层的平均值为 3,第 1 层的平均值为 14.5,第 2 层的平均值为 11 。
因此返回 [3, 14.5, 11] 。

示例 2:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ILyhAOkc-1671953757561)(https://assets.leetcode.com/uploads/2021/03/09/avg2-tree.jpg)]

输入:root = [3,9,20,15,7]
输出:[3.00000,14.50000,11.00000]

提示:

  • 树中节点数量在 [1, 104] 范围内
  • -231 <= Node.val <= 231 - 1

思路:套用层序遍历的模板,然后记录当前层的最后一个node,和下一层的最后一个node.(如果知道当前层的最后一个node是哪一个,在把node的左右节点发放入队列的时候,下一层的最后一个node就能得出)。然后就能够求每一层的平均值了。

代码:

class Solution {public List<Double> averageOfLevels(TreeNode root) {LinkedList<TreeNode> quene = new LinkedList();List<Double> res = new ArrayList();TreeNode lastNode = root;  //当前层的最后一个nodeTreeNode nextLastNode = null;   //下一层的最后一个nodeint count = 0;long sum = 0;quene.add(root);// 层序遍历的应用while(quene.size() != 0) {TreeNode value = quene.poll();if(value.left != null){quene.add(value.left);nextLastNode = value.left;}if(value.right != null){quene.add(value.right);nextLastNode = value.right;}count++;sum += value.val;if(value == lastNode) {Double d = sum/(double)count;res.add(d);count = 0;sum = 0;lastNode = nextLastNode;nextLastNode = null;}}return res;}
}

3.2 二叉树最大宽度(中等)

给你一棵二叉树的根节点 root ,返回树的 最大宽度

树的 最大宽度 是所有层中最大的 宽度

每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。将这个二叉树视作与满二叉树结构相同,两端点间会出现一些延伸到这一层的 null 节点,这些 null 节点也计入长度。

题目数据保证答案将会在 32 位 带符号整数范围内。

示例 1:

img

输入:root = [1,3,2,5,3,null,9]
输出:4
解释:最大宽度出现在树的第 3 层,宽度为 4 (5,3,null,9) 。

示例 2:

img

输入:root = [1,3,2,5,null,null,9,6,null,7]
输出:7
解释:最大宽度出现在树的第 4 层,宽度为 7 (6,null,null,null,null,null,7) 。

示例 3:

img

输入:root = [1,3,2,5]
输出:2
解释:最大宽度出现在树的第 2 层,宽度为 2 (3,2) 。

提示:

  • 树中节点的数目范围是 [1, 3000]
  • -100 <= Node.val <= 100

思路:这一题的难点在于这些 null 节点也计入长度,而不是非空节点的宽度。

可以对节点进行编号。一个编号为 index,index 的左子节点的编号记为 2×index,右子节点的编号记为 2×index+1。直接对当前层最左边和最右边的节点相减再加1即可。和上一题的不同的一点是,还要知道当前层的第一个节点是谁。

代码:

class Solution {public int widthOfBinaryTree(TreeNode root) {if(root == null) {return 0;}//层序遍历int max = 0;TreeNode lastNode = root;TreeNode firstNode = root;TreeNode nextLastNode = null;boolean firstFlag = false;LinkedList<TreeNode> stack = new LinkedList();HashMap<TreeNode,Integer> map = new HashMap();  //用于给节点编号stack.push(root);map.put(root,1);while(stack.size() != 0) {TreeNode node = stack.poll();if(!firstFlag){firstFlag = true;firstNode = node;}if(node.left != null) {stack.add(node.left);map.put(node.left,map.get(node)*2);  //给左子节点编号nextLastNode = node.left;}if(node.right != null) {stack.add(node.right);map.put(node.right,map.get(node)*2+1); //给右子节点编号nextLastNode = node.right;}if(node == lastNode) {max = Math.max(max,map.get(lastNode)-map.get(firstNode)+1);lastNode = nextLastNode;nextLastNode = null;firstFlag = false;}}return max;}}

3.3 二叉树的完全性检验(中等)

给定一个二叉树的 root ,确定它是否是一个 完全二叉树

在一个 完全二叉树 中,除了最后一个关卡外,所有关卡都是完全被填满的,并且最后一个关卡中的所有节点都是尽可能靠左的。它可以包含 12h 节点之间的最后一级 h

示例 1:

img

输入:root = [1,2,3,4,5,6]
输出:true
解释:最后一层前的每一层都是满的(即,结点值为 {1} 和 {2,3} 的两层),且最后一层中的所有结点({4,5,6})都尽可能地向左。

示例 2:

img

输入:root = [1,2,3,4,5,null,7]
输出:false
解释:值为 7 的结点没有尽可能靠向左侧。

提示:

  • 树的结点数在范围 [1, 100] 内。
  • 1 <= Node.val <= 1000

思路:层序遍历,对每一个节点进行检查。1.遇到左子节点为空,右子节点不为空的情况,不满足 2.遇到第一个左子节点不为空,右子节点为空或者在右子节点都为空的时候,下面的节点子节点均为叶。

代码:

class Solution {public int widthOfBinaryTree(TreeNode root) {if(root == null) {return 0;}//层序遍历int max = 0;TreeNode lastNode = root;TreeNode firstNode = root;TreeNode nextLastNode = null;boolean firstFlag = false;LinkedList<TreeNode> stack = new LinkedList();HashMap<TreeNode,Integer> map = new HashMap();stack.push(root);map.put(root,1);while(stack.size() != 0) {TreeNode node = stack.poll();if(!firstFlag){firstFlag = true;firstNode = node;}if(node.left != null) {stack.add(node.left);map.put(node.left,map.get(node)*2);nextLastNode = node.left;}if(node.right != null) {stack.add(node.right);map.put(node.right,map.get(node)*2+1);nextLastNode = node.right;}if(node == lastNode) {max = Math.max(max,map.get(lastNode)-map.get(firstNode)+1);lastNode = nextLastNode;nextLastNode = null;firstFlag = false;}}return max;}
}

4. 验证二叉搜索树(中等)

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

  • 节点的左子树只包含 小于 当前节点的数。
  • 节点的右子树只包含 大于 当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

示例 1:

img

输入:root = [2,1,3]
输出:true

示例 2:

img

输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。

提示:

  • 树中节点数目范围在[1, 104]
  • -231 <= Node.val <= 231 - 1

思路:左右子树是二叉搜索数,并且左子数的最大值应该小于当前值,右子数的最小值,应该大于当前值

代码:

class TreeRes {boolean flag;Integer min;Integer max;TreeRes(boolean flag, Integer min, Integer max) {this.flag = flag;this.min = min;this.max = max;}
} class Solution {public boolean isValidBST(TreeNode root) {if(root == null) {return true;}return isBST(root).flag; }public TreeRes isBST(TreeNode root) {if(root == null) {return new TreeRes(true,null,null);}TreeRes leftRes = isBST(root.left);TreeRes rightRes = isBST(root.right);if((!leftRes.flag) || (!rightRes.flag)) {return new TreeRes(false,null,null);}if((leftRes.max != null && leftRes.max >= root.val) || (rightRes.min != null && rightRes.min <= root.val)) {return new TreeRes(false,null,null);}int min = leftRes.min != null ? leftRes.min : root.val;int max = rightRes.max != null ? rightRes.max : root.val;return new TreeRes(true,min,max);}}

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

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

相关文章

VS coda C++、python运行与Dbug配置

首先新建终端 一次性使用C方法 检查C编译器是否存在 which g可见位置存在于&#xff1a;/usr/bin/g 一次性命令格式&#xff1a; 使用json配置文件 运行C方法&#xff08;推荐&#xff09;&#xff1a; 根据你查找的g的位置来决定 使用配置好的tasks.json&#xff08;C的…

Java window多环境配置

目录JDK版本下载配置内容描述创建JAVA_HOME在Path配置版本切换效果JDK版本下载 Java8 Download address 这个是Java8 的下载地址&#xff0c;下载是要登录的&#xff0c;自己花费一点时间去注册。如果想要下载其它版本的JDK&#xff0c;请看下面的图&#xff0c;然后你就可以看…

SSD_学习笔记记录

one-steage VGG16模型的修改 VGG16的模型输出&#xff0c;其中224.。。为特征图的大小。 SSD模型中对VGG网络的修改&#xff1a; SSD模型是对VGG中的第四个卷积块中的最后一个Conv2d进行第一个输出&#xff0c;在这里简称为Conv4-3。以及第五个卷积块中的最后一个Conv2d进行…

前端开发:Vue封装通过API调用的组件的方法

前言 在前端开发中&#xff0c;关于Vue的使用相比大家并不陌生&#xff0c;而且Vue框架的优势也是其他框架所不能比的&#xff0c;尤其是Vue的封装思想更是堪称一绝&#xff0c;还有就是组件化的运用实践过程也是亮点。所以关于Vue框架的使用想必看官都不陌生&#xff0c;而且常…

干货 | 关于PCB中的“平衡铜”,一文全部说明白

平衡铜是PCB设计的一个重要环节&#xff0c;对PCB上闲置的空间用铜箔进行填充&#xff0c;一般将其设置为地平面。 平衡铜的意义在于&#xff1a; 对信号来说&#xff0c;提供更好的返回路径&#xff0c;提高抗干扰能力&#xff1b;对电源来说&#xff0c;降低阻抗&#xff0c;…

8 NP完全性理论

8 NP完全性理论 p问题 NP问题 NP完全问题 NPC(complete ) NP难问题NP-hard p问题 是一类能够用**(确定的)算法**在多项式时间内求解的可判定问题 ●这种问题类型也称为多项式类型 NP问题 是一类能够用不确定算法在多项式时间内求解的可判定问题 在确定性计算模型下多项式时…

Web前端105天-day64-HTML5_CORE

HTML5CORE04 目录 前言 一、复习 二、WebSocket 三、服务器搭建 四、聊天室 五、defineProperty 5.1.初识defineProperty 5.2.配置多个属性 5.3.可配置 5.4.赋值监听 5.5.练习 5.6.计算属性 总结 前言 HTML5CORE04学习开始 一、复习 SVG: 利用HTML的 DOM 来绘制图…

juc-4-synchronized原理

目录 1、synchronized 作用于静态方法 总结 ​编辑 案例 静态成员变量 (synchronized锁非静态方法) 案例 静态成员变量 (synchronized锁静态方法 或 直接锁类) 2、监视器锁(monitor) 2.1 synchronized怎么实现的线程安全呢&#xff1f; 3、JDK6 synchronized 的优化 3.1 C…

6.s081 学习实验记录(二)xv6 and unix utilities

文章目录一、boot xv6二、sleep三、pingpong四、primes五、find六、xargs该实验主要用来熟悉xv6以及其系统调用 一、boot xv6 实验目的&#xff1a; 启动xv6系统&#xff0c;并使用提供的命令ls&#xff0c;列出系统所有的文件ctrl p&#xff0c;打印当前运行的进程ctrl a…

IP地址分类及范围详解

IP地址分为公网IP地址&#xff08;合法IP地址&#xff09;和私有IP地址 公网IP地址主要应用于Internet上的主机访问&#xff0c;而私有IP地址应用于局域网中计算机的相互通信。 IP地址的表示形式&#xff1a;分为二进制表示和点分十进制表示。现在使用的IP地址长度均为32位/4个…

玩转GPT--在线文本生成项目[可入坑~科普系列]

文章目录前言效果页面说明文字个数top_KTop_Ptemperature聊天上下文关联记忆项目部署获取项目获取模型运行彩蛋总结前言 没办法&#xff0c;最近ChatGPT杀疯了&#xff0c;没忍住&#xff0c;还是想look&#xff0c;look。没办法&#xff0c;哪个帅小伙能够忍受的了一个可以和…

红中私教:计网那点事(1)

前言 &#x1f340;作者简介&#xff1a;被吉师散养、喜欢前端、学过后端、练过CTF、玩过DOS、不喜欢java的不知名学生。 &#x1f341;个人主页&#xff1a;红中 &#x1f342;专栏地址&#xff1a;网安专栏 光明神已陨落&#xff0c;现在 由计网引领我 破戒了&#xff0c;本来…

力扣刷题笔记day10(树的子结构+二叉树镜像+对称的二叉树)

文章目录树的子结构题目思路代码二叉树镜像题目思路代码对称的二叉树题目思路代码树的子结构 输入两棵二叉树A和B&#xff0c;判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构&#xff0c; 即 A中有出现和B相同的结构和节点值。 题目 思路 dfs(A, B) …

圣诞节,记录前行中跨过的2022

2022年&#xff0c;我人生的第二十四年&#xff0c;是我大学生活的最后一年&#xff0c;是我职场生涯的第一年&#xff0c;这一年从学生到打工人&#xff0c;从实习生到职场员工&#xff0c;变化了许多&#xff0c;做了许多&#xff0c;收获了许多&#xff0c;同时也成长了许多…

《教育的目的》笔记——如何让学生通过树木看见森林

目录 作者简介 个人感悟 经典摘录 1、学生所受的训练应该比他们最终投身的专业更为广泛 2、学习新语言用途 3、教师的责任 4、教育的主题 5、学到的有用之物 6、教育目的 7、所有事物都不是静态的、定型的&#xff0c;而是处于形成&#xff08;becoming&#xff09;过…

【C函数】函数详解

函数前言一、函数是什么二、C语言中函数的分类&#xff08;一&#xff09;库函数1.printf类2.strcpy类3.math类4.概念5.小知识6.总结&#xff08;二&#xff09;自定义函数1.概念2.函数的组成3.例子1&#xff08;求出两个数中的最大值&#xff09;4.例子2&#xff08;交换两个整…

三、SpringBoot启动流程及自动化配置

一、Springboot启动流程 图一:Springboot项目的启动流程 首先,针对上图中自己不太明确的两个知识点,这里做如下总结: 1.Banner:参考这篇文章:SpringBoot之Banner介绍 - MarkLogZhu - 博客园 (cnblogs.com) ; 2.钩子方…

HRTransNet阅读理解

E. Dual-direction short connection fusion module HRFormer applies transformer blocks to enlarge receptive field of fused feature Frs, and uses exchange units to absorb the merits of multi-scales features. The process is described as: HRFormer使用TRM块来扩…

程序员过圣诞 | 用HTML写出绽放的烟花

文章目录一、前言二、创意名三、效果展示四、烟花代码五、总结一、前言 2022年圣诞节到来啦&#xff0c;圣诞节是基督教纪念耶稣诞生的重要节日。亦称耶稣圣诞节、主降生节&#xff0c;天主教亦称耶稣圣诞瞻礼。耶稣诞生的日期&#xff0c;《圣经》并无记载。公元336年罗马教会…

平衡二叉树的一系列操作:删除、插入(在二叉排序树中插入新结点后,如何保持平衡)、调整平衡等等等

平衡二叉树的插入&#xff08;在二叉排序树中插入新结点后&#xff0c;如何保持平衡&#xff09;1.平衡二叉树的定义2.平衡二叉树的插入&#xff08;调整最小不平衡子树A&#xff09;2.1LL&#xff08;在A的左孩子的左子树中插入导致不平衡&#xff09;2.2RR&#xff08;在A的右…