题目
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
思路:
重要思路:查看整棵树是否平衡,重要思路,从下往上依次判断,若下面的子树都平衡了,就平衡,有一个不平衡,就不平衡,计算树的高度也是,从下往上,计算左子树高度和右子树高度,当然也可以使用队列,从上往下
https://leetcode-cn.com/problems/ping-heng-er-cha-shu-lcof/solution/mian-shi-ti-55-ii-ping-heng-er-cha-shu-cong-di-zhi/
==判断树是否平衡,从下往上依次判断,==使用后序遍历。
方法一:剪枝
从下往上依次判断根节点(父节点的左节点或右节点)这棵小树是否平衡,如果不平衡,直接返回它的上一个根节点(父节点)一个-1,父节点就不会再去判断另一个节点了,俗称剪枝。
class Solution {
public boolean isBalanced(TreeNode root) {
if(root == null) return true;
return recur(root) != -1;
}
private int recur(TreeNode root) {
if(root == null) return 0;
int left = recur(root.left);
if(left == -1) return -1; // 直接返回,不用再计算右子树了,-1返回的是调用它的根节点root的高度
int right = recur(root.right);
if(right == -1) return -1; // 直接返回调用它的根节点-1,根节点也不用去计算左子树和右子树的最大值+1,根节点的高度直接赋值为-1
return Math.abs(left - right) < 2 ? Math.max(left, right) + 1 : -1;
}
}
方法二:
从下往上查看(后序遍历,左右中),计算左子树高度,计算右子树高度,高度差是否大于等于2,是就返回false。
返回左子树的结果和右子树的结果的交集。一层一层的向上归
class Solution {
public boolean isBalanced(TreeNode root) {
if(root == null) return true;
int left = maxDepth(root.left);
int right = maxDepth(root.right);
if(Math.abs(left - right) >= 2) return false;
return isBalanced(root.left) && isBalanced(root.right);
}
public int maxDepth(TreeNode root) {
if(root == null) return 0;
return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;
}
}