当前位置:   article > 正文

算法通关村——轻松搞定树的深度和高度问题_树节点的深度 和高度

树节点的深度 和高度

树中的深度和高度问题

1、树的深度和高度的定义

  • 节点ni的深度:从根节点到ni的唯一路径长。即,节点ni所在的层次(根节点为0层),树的深度=树中节点的最大层次

  • 节点ni的高度:从ni到一片树叶的最长路径长。即,叶子节点的高度为0,树的高度 = 根的高度。

    注意,在高度与深度的计算中,leetcode中都是以节点为1度,但是维基百科上是以边为1度,本篇以leetcode为准,用节点数来计算树的深度与高度。

图示如下:

二叉树的深度和高度

2、最大深度问题

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

​ 我们先来看一个简单情况:

921a584ac5b9fca176bdaef9356cab43

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

​ 然后再增加几个节点:

c2be44491ec656bc3e5708ea4817fb80

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

int depth = 1 + max(leftDepth,rightDepth)
  • 1

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

int leftDepth = getDepth(node.left);  //左
int rightDepth = getDepth(node.right);//右
int depth = 1 + max(leftDepth, rightDepth); //中
  • 1
  • 2
  • 3

​ 那什么时候结束呢,这里仍然是root == null返回0就行了,组合在一起就是下面的代码:

public int maxDepth(TreeNode root) {
	int (root == null){
        return 0;
    }
    int leftHeight = maxDepth(root.left);
    int rightHeight = maxDepth(root.right);
    return Math.max(leftHeight, rightHeight) + 1;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

3、判断平衡树

​ LeetCode110. 判断平衡二叉树:给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。

​ 仍然从最简单的情况来分析:

921a584ac5b9fca176bdaef9356cab43

​ 很显然只有两层的时候一定是平衡的,因为对于node(3),左右孩子如果只有一个,那高度差就是1;如果左右子孩子都有或者都没有,则高度差为0。再来看看增加一层的情况:

c2be44491ec656bc3e5708ea4817fb80

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

​ 当节点root 左/右子树的高度差<2,则返回节点root的左右子树中最大高度加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;
  • 1
  • 2
  • 3

​ 假如子树已经不平衡了,则不需要再递归了直接返回就行,比如这个树中节点4

10b973084aff566ed37d896847ced818

​ 具体的代码如下:

class Solution {
	public boolean isBalanced(TreeNode root) {
		return height(root) >= 0;
	}
    
    public int height(TreeNode root){
        if (root == null) {
            return 0;
        }
        int leftHeight = height(root.left);
        int rightHeight = height(root.right);
        if(leftHeight == -1 || rightHeight == -1 || Math.abs(leftHeight - rightHeight) > 1) {
            return -1;
        } else {
            return Math.max(leftHeight, rightHeight) + 1;
        }
    }   
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

4、最小深度

​ LeetCode111. 给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量,例如下面的例子返回结果为2。

​ **说明:**叶子节点是指没有子节点的节点

6e9e10a3fe93b337199835f139226a9f

​ 这题的关键是最小深度的一层必须有叶子节点,因此不能直接将前两题的Max改成Min,要重新分析终止条件

​ 如果左子树为空,右子树不为空,说明最小深度是1+右子树的深度

​ 反之,右子树为空,左子树不为空,说明最小深度是1+左子树的深度

​ 最后如果左右子树都不为空,返回左右子树深度最小值+1。

​ 具体代码如下:

public int minDepth(TreeNode root){
    if (root == null){
        return 0;
    }
    
    if (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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/566949
推荐阅读
相关标签
  

闽ICP备14008679号