与二叉树深度相关的力扣题(104、110、543)
第104题:
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7]
3 / \ 9 20 / \ 15 7
返回它的最大深度 3 。
分析:
题目给出了最大深度的定义,也就是根节点到最远叶子结点的的最长路径上的节点数,那么就是遍历呗,从宏观的角度来讲就是看看根节点的左右子树谁的深度最大,然后拿出来,加上根节点的个数1,就是最终的答案。那么就采用递归的方式,求当前根节点下,左右子树的最大值,然后加1返回上一层,直到返回到最终的根节点,再选出根节点的左右子树的最大值然后加1,返回最终的结果。
public int maxDepth(TreeNode root) { if (root == null){ return 0; } return Math.max(maxDepth(root.left),maxDepth(root.right)) + 1; }
这个题只是之后两个题的基础,具有很强的应用意义,可帮助解决其他的问题。
第110题:
给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。
示例:
给定二叉树 [3,9,20,null,null,15,7]
3 / \ 9 20 / \ 15 7
返回 true
。
给定二叉树 [1,2,2,3,3,null,null,4,4]
1 / \ 2 2 / \ 3 3 / \ 4 4
返回 false
。
分析:
关键点就是判断整个二叉树的所有节点的左右子树的高度差的绝对值是否小于等于1,如果不是则不是高度平衡的二叉树,如果是,则是高度平衡的二叉树。既然左右子树的高度差是判断是否是平衡二叉树的关键,那么我们就需要计算左右子树的高度,其实也就是深度,因为要保证整个二叉树都是平衡的,那么我们就需要对二叉树进行遍历,因此可以借助上面那个题解决。无非是在遍历的过程中,多了一个平衡的判断啊。
代码如下:
private boolean res = true; public boolean isBalanced(TreeNode root) { if (root == null){ return true; } getDepth(root); return res; } private int getDepth(TreeNode root){ if (root == null){ return 0; } int l = getDepth(root.left); int r = getDepth(root.right); if (Math.abs(l - r) > 1){ res = false; } return Math.max(l,r) + 1; }
第543题:
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
示例:
1 / \ 2 3 / \ 4 5
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。
注意:两结点之间的路径长度是以它们之间边的数目表示。
分析:
结果路径只有两种可能,一种是从根节点一直到某个叶子节点;一种是从一个子树的叶子节点到同根的另一个子树的叶子节点。第一种情况,只可能是根节点只有一棵子树的时候发生,否则,如果两个子树都存在,那么从一个子树的叶子节点到另一个子树的叶子节点的路径长度一定大于从根节点到叶子结点的路径长度,所以可以将第一种情况看成是第二种情况的特殊情形。至于,路径的长度,题目说是路径的边的个数,其实边的个数也等于路径中节点的个数减去1,那么直接求每个节点的左右子树的深度然后相加即可,然后定义一个全局的成员变量,将相加后的值与成员变量的值比较,如果大于则将其赋予成员变量,直到多有的节点遍历完。还是在第一道题的基础上,进行改动。
代码如下:
int maxr = 0; public int diameterOfBinaryTree(TreeNode root) { if (root == null){ return 0; } getDepth(root); return maxr; } private int getDepth(TreeNode root){ if (root == null){ return 0; } int l = getDepth(root.left); int r = getDepth(root.right); if ((r+l) > maxr){ maxr = l+r; } return Math.max(l,r) + 1; }