二叉树的深度和高度问题-算法通关村

二叉树的深度和高度问题-算法通关村


1 最大深度问题

  • LeetCode104: 给定一个二叉树,找出其最大深度。

  • 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
    说明:叶子节点是指没有子节点的节点。

  • 对于node(3),最大深度自然是左右子结点+1,左右子节点有的可能为空,只要有一个,树的最大高度就是1+1=2。然后再增加几个结点:

  • 很显然相对于node(20),最大深度自然是左右子结点+1,左右子节点有的可能为空,只要有一个,树的最大高度就是1+1=2,用代码表示就是:

  • int depth = 1 + max(leftDepth, rightDepth);
    而对于3,则是左右子树深度最大的那个然后再+1,具体谁更大,则不必关心。所以对于node(3)的判断逻辑就是:

  • int leftDepth = getDepth(node, left);//左
    int rightDepth = getDepth(node, right)//右
    int depth = 1 + max(leftDepth, rightDepth);//中
  • 那什么时候结束呢,这里仍然是root == null返回0就行了。至于入参,自然是要处理的子树的根节点root,而返回值则是当前root所在子树的最大高度。所以合在一起就是:

  •   public int maxDepth(TreeNode root){if(root == null){return 0;}int leftDepth = maxDepth(root.left);int rightDepth = maxDepth(root.right);return Math.max(leftDepth, rightDepth) + 1;}
    
  • 上面代码先拿到左右子树的结果再计算Math.max(left, right)+ 1,这与后序遍历本质上一样的,因此可以看做后序遍历的拓展问题。
    我们继续分析这个题,如果确定树最大有几层是不是也就知道最大深度了?是的,直接套用层序遍历的代码就可以。

  •   public int maxDepth2(TreeNode root){if(root == null){return 0;}Deque<TreeNode> queue = new ArrayDeque<>();queue.offer(root);int depth = 0;while(!queue.isEmpty()){for(int i = 0; i < queue.size(); i++){TreeNode temp = queue.poll();if(temp.left != null){queue.offer(temp.left);}if(temp.right != null){queue.offer(temp.right);}}depth++;}return depth;}
    

2 判断平衡二叉树

  • LeetCode110 判断平衡二叉树:给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树**每个节点** 的左右两个子树的高度差的绝对值不超过1。
    这里的要求是二又树每个节点的左右两个子树的高度差的绝对值不超过1。先补充一个问题,高度和深度怎么区分呢?
    • 二又树节点的深度:指从根节点到该节点的最长简单路径边的条数。
    • 二又树节点的高度:指从该节点到叶子节点的最长简单路径边的条数。
    直接看图:

  • 关于根节点的深度究竟是1还是0,不同的地方有不一样的标准,leetcode的题目中都是以根节点深度是1,其他的就不管了。
    言归正传,我们仍然先看一个最简单的情况:

  • 很显然只有两层的时候一定是平衡的,因为对于node(3),左右孩子如果只有一个,那高度差就是1;如果左右子孩子都有或者都没有,则高度差为0。如果增加一层会怎么样呢?如下图:

  • 对于node(3),需要同时知道自己左右子树的最大高度差是否<2。

    • 当节点root 左 / 右子树的高度差<2,则返回节点 root 的左右子树中最大高度加1(max(left, right) + 1);参考上面的高度和深度的对比图思考一下,这里为什么是最大高度?
    • 当节点root 左/右子树的高度差 ≥2:则返回-1,代表 此子树不是平衡树。
      也就是:
  • int left = recur(root.left);
    int right = recur(root.right);
    return Math.abs(left-right) < 2 ? Math.max(left, right) + 1 : -1;
  • 这就是核心递归,假如子树已经不平衡了,则不需要再递归了直接返回就行,比如下面树中的结点4

  •   class BalancedTree{public boolean isBalanced(TreeNode root){return height(root) >= 0;}public int height(TreeNode root){if(root == null){return 0;}int leftDepth = height(root.left);int rightDepth = height(root.right);if(leftDepth == -1 || rightDepth == -1 || Math.abs(leftDepth-rightDepth) > 1){return -1;}else{return Math.max(leftDepth, rightDepth) +1;}}}
    

3 最小深度

  • 既然有最大深度,那是否有最小深度呢?LeetCode111:给定一个二叉树,找出其最小深度。最小深度是**从根节点到最近叶子节点的**最短路径上的节点数量,例如下面的例子返回结果为 3 。说明:叶子节点是指没有子节点的节点。

  • 这里的关键问题是题目中说的:最小深度是从根节点到最近叶子节点的最短路径上的节点数量,也就是最小深度的一层必须要有叶子结点。

  • 这里的核心问题仍然是分析终止条件:

    • 如果左子树为空,右子树不为空,说明最小深度是1+右子树的深度。
    • 反之,右子树为空,左子树不为空,最小深度是1+左子树的深度。
    • 最后如果左右子树都不为空,返回左右子树深度最小值+1。
      代码如下:
  •   public int minDepth(TreeNode root){if(root == null){return 0;}//说明root是一个叶子节点,其最小深度为1if(root.left == null && root.right == null){return 1;}//为了确保在比较时,任何实际的深度值都会比这个初始值小。int min_depth = Integer.MAX_VALUE;if(root.left != null){min_depth = Math.min(minDepth(root.left), min_depth);}if(root.right != null){min_depth = Math.min(minDepth(root.right), min_depth);}return min_depth + 1;}
  • 除了递归方式,我们也可使用层次遍历,只要遍历时,第一次遇到叶子就直接返回其所在的层次即可。

  •   public int minDepth2(TreeNode root){if(root == null){return 0;}Deque<TreeNode> queue = new ArrayDeque<>();queue.offer(root);int minDepth = 0;while(!queue.isEmpty()){//将minDepth增加1,表示当前遍历的深度增加了一层minDepth++;for(int i = 0; i < queue.size(); i++){TreeNode temp = queue.poll();if(temp.left == null && temp.right == null){return minDepth;}if(temp.left != null){queue.offer(temp.left);}if(temp.right != null){queue.offer(temp.right);}}}return 0;}
    

4 N叉树的最大深度

  • 如果将二叉树换成N叉树又该怎么做呢?

  • LeetCode559.给定一个 N 叉树,找到其最大深度。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。
    N 叉树输入按层序遍历序列化表示,每组子节点由空值分隔(请参见示例)。

  • 示例1:
    输入:root = [1, null, 3, 2, 4, null, 5, 6]
    输出:3
    示例2:
    输入:root = [ 1, null, 2, 3, 4, 5, null, null, 6, 7, null, 8, null, 9, 10, null, null, 11, null, 12, null, 13, null, null, 14 ]
    输出:5
  • 这道题就是将二叉树换成了N叉树,不同点就在于N叉树节点比较多,我们使用list,遍历时用for即可。

  • N叉树的定义:

  •   public class Node {public int val;public List<Node> children;public Node() {}public Node(int val) {this.val = val;}public Node(int val, List<Node> children) {this.val = val;this.children = children;}}
    
  •   public int maxDepthNTree(Node root){if(root == null){return 0;}else if(root.children.isEmpty()){//当前节点是一个叶子节点,其最大深度为1,直接返回1。return 1;}else{List<Integer> heights = new ArrayList<>();for (Node child : root.children) {heights.add(maxDepthNTree(child));}return Collections.max(heights) + 1;}}
    

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

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

相关文章

《吴恩达:AI 智能体工作流引领人工智能新趋势》

近期值得看的 AI 视频之一&#xff1a;《吴恩达&#xff1a;AI 智能体工作流引领人工智能新趋势》这是吴恩达老师分享的他在 AI 智能体方面的发现。如果说智人区分于其他物种的能力是我们善用工具&#xff0c;那么对于 AI 来说&#xff0c;智能体就是它的工具。根据吴老师分享的…

服务器远程桌面连接不上怎么办?

随着互联网的发展和远程办公的兴起&#xff0c;服务器远程桌面连接成为了许多企业和个人不可或缺的工具。偶尔我们可能会碰到服务器远程桌面连接不上的情况&#xff0c;这时候我们需要找到解决办法&#xff0c;确保高效地远程访问服务器。 天联组网——突破远程连接障碍 在我们…

【机器学习】机器学习创建算法第3篇:K-近邻算法,学习目标【附代码文档】

机器学习&#xff08;算法篇&#xff09;完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;机器学习算法课程定位、目标&#xff0c;K-近邻算法定位,目标,学习目标,1 什么是K-近邻算法,1 Scikit-learn工具介绍,2 K-近邻算法API。K-近邻算法&#xff0c;1.4 …

pygwalker+streamlit python看板库使用体验

算作前言 在 B 站看到 pygwalker 的介绍&#xff0c;很感兴趣。 是一个类似于简化版的 tableau 工具。 原版 docs PyGWalker 文档 – Kanaries 搭建看板 直接结合 streamlit 使用&#xff0c;streamlit 真的神器。 import pygwalker as pyg import pandas as pd import str…

2024年网络安全运营体系建设方案

以下是部分WORD内容&#xff0c;请您参阅。如需下载完整WORD文件&#xff0c;请前往星球获取&#xff1a; 网络安全运营监控工作整体构想 工作目标及原则 工作目标 为进一步落实强化公司网络安全保障&#xff0c;有效支撑公司数字化转型战略&#xff0c;建立健全公司网省两级协…

Echarts实现高亮某一个点

背景 接口会返回所有点的数据&#xff0c;以及最优点的数据。产品要求在绘制图形后&#xff0c;高亮最优点&#xff0c;添加一个红色的样式&#xff0c;如图。点击select选择器时&#xff0c;可选择不同指标和花费对应的关系。 以下介绍实现思路 1、自定义配置选择器的数据源…

【Web】记录Polar靶场<中等>难度题一遍过(全)

目录 到底给不给flag呢 写shell 注入 某函数的复仇 xxe SSTI unpickle BlackMagic 反序列化 找找shell 再来ping一波啊 wu 代码审计1 你的马呢&#xff1f; ezphp 随机值 phpurl search file PlayGame csdn 反正持续一个月&#xff0c;感觉XYCTF…

2024年,短期PMP备考上岸攻略!

今天分享一个PMP备考经验&#xff0c;正在备考PMP的小伙伴&#xff0c;咱们共勉&#xff01; 第一周、阅读教材 之前是第六版教材&#xff0c;花了很长时间阅读和梳理框架。现在是第七版教材&#xff0c;内容少了很多&#xff0c;只有300多页&#xff0c;不会特别耗时间&…

offsetof宏(想了解offsetof宏的使用,那么看这一篇就足够了!)

前言&#xff1a;在我们学习结构体的时候&#xff0c;我们知道&#xff0c;结构体中的元素不一定是紧密排列的&#xff0c;其中有对其数和偏移量&#xff0c;那么有没有什么方法能直接输出某个元素的偏移量呢&#xff1f;答案是有的&#xff0c;我们只需要使用offsetof宏即可。…

网络安全之IP地址证书的重要性

在数字化时代&#xff0c;网络空间已成为各类活动的重要载体&#xff0c;无论是商业交易、信息交流还是远程办公&#xff0c;都离不开互联网的支撑。然而&#xff0c;网络环境的开放性与匿名性也带来了安全风险&#xff0c;如何确保网络交互中的身份真实可信&#xff0c;成为了…

13.Python图形用户界面

我们之前的程序运行结果都被输出到命令提示符&#xff08;终端&#xff09;窗口&#xff0c;界 面比较简陋。本章讲解如何将其输出到图形界面。 1 Python中的图形用户界面开发库 注Qt是一个跨平台的C应用程序开发框架&#xff0c;被广泛用于开发GUI 程序&#xff0c;也可用于开…

mysql 本地电脑服务部署

前提&#xff1a; 下载mysql 新建配置文档 在安装mysql目录新建 my.ini [mysqld] # 设置3306端口 port3306#设置mysql的安装目录 basedirC:\Program Files\MySQL\MySQL Server 8.3 #切记此处一定要用双斜杠\\,单斜杠我这里会出错&#xff0c;不过看别人的教程&#xff0c;有…