题目描述(简单难度)
判断一棵树是否是平衡二叉树,平衡二叉树定义如下:
它是一棵空树或它的左右两个子树的高度差的绝对值不超过 1,并且左右两个子树都是一棵平衡二叉树。
解法一
直接按照定义来吧,并且多定义一个求高度的函数,之前在 104 题 做过。
class TreeNode{
int val;
TreeNode left;
TreeNode right;
TreeNode(int x){val=x;}
}
public class Balanced_Binary_Tree {
public static boolean isBalanced(TreeNode root) {
//它是一棵空树
if(root==null) return true;
//它的左右两个子树的高度差的绝对值不超过1
int leftDepth=getTreeDepth(root.left);
int rightDepth=getTreeDepth(root.right);
if(Math.abs(leftDepth-rightDepth)>1) {
return false;
}
return isBalanced(root.left) && isBalanced(root.right);//再分别判断左右子树是不是平衡二叉树
}
private static int getTreeDepth(TreeNode root) {
if(root==null) return 0;
int leftDepth=getTreeDepth(root.left);
int rightDepth=getTreeDepth(root.right);
return Math.max(leftDepth, rightDepth)+1;
}
public static void main(String args[]) {
TreeNode[] node=new TreeNode[5];
node[0]=new TreeNode(3);
node[1]=new TreeNode(9);
node[2]=new TreeNode(20);
node[3]=new TreeNode(15);
node[4]=new TreeNode(7);
node[0].left=node[1];
node[0].right=node[2];
node[2].left=node[3];
node[2].right=node[4];
boolean ans=isBalanced(node[0]);
System.out.println(ans);
}
}
解法二 自底向上的递归
public class Balanced_Binary_Tree2 {
public static boolean isBalanced(TreeNode root) {
if(root==null) return true;
return (Math.abs(height(root.left)-height(root.right))<2) && isBalanced(root.left) && isBalanced(root.right);
}
private static int height(TreeNode root) {
if (root==null) return -1;
return Math.max(height(root.left), height(root.right)) + 1;
}
public static void main(String args[]) {
TreeNode[] node=new TreeNode[5];
node[0]=new TreeNode(3);
node[1]=new TreeNode(9);
node[2]=new TreeNode(20);
node[3]=new TreeNode(15);
node[4]=new TreeNode(7);
node[0].left=node[1];
node[0].right=node[2];
node[2].left=node[3];
node[2].right=node[4];
boolean ans=isBalanced(node[0]);
System.out.println(ans);
}
}
参考文献
1.https://zhuanlan.zhihu.com/p/74779640
2.https://leetcode-cn.com/problems/balanced-binary-tree/solution/ping-heng-er-cha-shu-by-leetcode/