題目描述(簡單難度)
判斷一棵樹是否是平衡二叉樹,平衡二叉樹定義如下:
它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過 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/