思路:本来,我看到这道题目的第一想法的遍历二叉树,然后计算每个节点的高度。我当时的想法就很简单,前序遍历并且计算,但是仔细一想这样会产生大量的重复计算,感觉题目这样子解不太好。当时看了一下题目的评论,看到了从底向上的计算方式,的确后序遍历只需要计算一次,比前序遍历更加简洁和快速。
以下是我手画的后序遍历思路图:
如下是代码及说明:
public class Main {
public static void main(String[]args){
Solution solution = new Solution();
//简单粗暴的测试用例 ╰( ̄▽ ̄)╮
TreeNode root = new TreeNode(1);
TreeNode lNode2 = new TreeNode(2);
TreeNode rNode2 = new TreeNode(2);
TreeNode lNode3 = new TreeNode(3);
TreeNode rNode3 = new TreeNode(3);
TreeNode lNode4 = new TreeNode(4);
TreeNode rNode4 = new TreeNode(4);
lNode3.left = lNode4;
lNode3.right = rNode4;
lNode2.left = lNode3;
lNode2.right = rNode3;
root.left = lNode2;
root.right = rNode2;
boolean f = solution.isBalanced(root);
System.out.println(f);
}
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
//使用后序遍历 从底部开始往上计算,只需要遍历一次即可完成计算。
class Solution {
public int f = 0;
public boolean isBalanced(TreeNode root) {
lrd(root);
return f <= 1;
}
//后序遍历
public int lrd(TreeNode root) {
if(root==null) {
return 0;
}
int l = 0;
int r = 0;
//使用递归,到达底部,然后递归至根节点
if(root.left!=null) {
//获取当前节点高度
l = lrd(root.left);
}
if(root.right!=null) {
r = lrd(root.right);
}
//每个节点计算左右差值,如果大于当前最大差值,则记录
int lr = Math.abs(l - r);
if(lr > f) {
f = lr;
}
//将当前树的高度+1,返回给父节点,告知父节点高度
return Math.max(l, r) + 1;
}
}