题目:
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
示例 1:
给定二叉树 [3,9,20,null,null,15,7]
返回 false 。
方法一:先序遍历 + 判断深度 (从顶至底)
一棵平衡二叉树的定义条件是,任意节点的左右子树的深度相差不超过1,也就是说一棵树是否是平衡树,那就要判断任意点的左右子树均为平衡二叉树且对应的高度差不超过1
算法分析:
abs(self.depth(root.left) - self.depth(root.right)) <= 1 :判断 当前子树 是否是平衡树;
self.isBalanced(root.left) : 先序遍历递归,判断 当前子树的左子树 是否是平衡树;
self.isBalanced(root.right) : 先序遍历递归,判断 当前子树的右子树 是否是平衡树;
/**
* 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) {
if(root==null){
return true;
}
return Math.abs(depth(root.left)-depth(root.right))<2 && isBalanced(root.left) && isBalanced(root.right);
}
public int depth(TreeNode root){
return root==null?0:Math.max(depth(root.left),depth(root.right))+1;
}
}
方法二、后序遍历+剪枝
自下向上做后序遍历,若判定某棵树不是平衡树,则直接向上返回
返回值
如果左子树和右子树高度差<2,则返回该树的高度,否则返回-1,代表当前节点代表的不是平衡树
终止条件
如果root==null则返回0
如果左子树和右子树高度差>=2则返回-1
如果左子树和右子树高度差<2则返回高度值
如果左子树或者右子树高度为-1时,则向上返回-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 recur(root)!=-1;
}
public int recur(TreeNode root){
if(root==null){
return 0;
}
int left = recur(root.left);
if(left==-1){
return -1;
}
int right = recur(root.right);
if(right==-1){
return -1;
}
return Math.abs(left-right)<2?Math.max(left,right)+1:-1;
}
}