最近按照tag做了几道字符串、数组、排序的easy题,确实比较easy就没有发出来。今天尝试二叉树tag果然第一题就卡住了。实在没有思路,看评论区发现一篇好博客!——递归三部曲。 原博客链接:
https://lyl0724.github.io/2020/01/25/1/
题目:
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isBalanced(TreeNode root) {
//递归三部曲
//什么时候停止递归;给上层返回什么;本层干什么
return high(root)>=0;
}
public int high(TreeNode root){
//空节点,返回高度0
if(root==null)return 0;
int lh=high(root.left);
int rh=high(root.right);
if(lh>=0&&rh>=0&&Math.abs(lh-rh)<=1){
return Math.max(lh,rh)+1;
}
return -1;
}
}
什么时候停止?当前节点为空的时候,给上层返回0。由于叶子节点的两个孩子都是空,所以所有的叶子结点的高度就都是1。然后,一层层往上,画个图的话非常的直观。加入某个节点的两个孩子高度差绝对值大于1了,就返回-1,然后就它的上层就不会进if了,就把-1传到了root,最终返回false。
这道题理解了之后,“二叉树的最大深度”也可以用同样的方法:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int maxDepth(TreeNode root) {
if(root==null)return 0;
int ld=maxDepth(root.left);
int rd=maxDepth(root.right);
if(root.left==null&&root.right==null){
return 1;
}
return ld>rd?ld+1:rd+1;
}
}