赞
踩
节点ni的深度:从根节点到ni的唯一路径长。即,节点ni所在的层次(根节点为0层),树的深度=树中节点的最大层次
节点ni的高度:从ni到一片树叶的最长路径长。即,叶子节点的高度为0,树的高度 = 根的高度。
注意,在高度与深度的计算中,leetcode中都是以节点为1度,但是维基百科上是以边为1度,本篇以leetcode为准,用节点数来计算树的深度与高度。
图示如下:
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就行了,组合在一起就是下面的代码:
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;
}
LeetCode110. 判断平衡二叉树:给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。
仍然从最简单的情况来分析:
很显然只有两层的时候一定是平衡的,因为对于node(3),左右孩子如果只有一个,那高度差就是1;如果左右子孩子都有或者都没有,则高度差为0。再来看看增加一层的情况:
对于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;
假如子树已经不平衡了,则不需要再递归了直接返回就行,比如这个树中节点4
具体的代码如下:
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; } } }
LeetCode111. 给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量,例如下面的例子返回结果为2。
**说明:**叶子节点是指没有子节点的节点
这题的关键是最小深度的一层必须有叶子节点,因此不能直接将前两题的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; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。