题目二:平衡二叉树
输入一棵平衡二叉树的根节点,判断该树是不是平衡二叉树。
如果某二叉树中任意节点的左右子树深度相差不超过1,那么它就是一棵平衡二叉树。
思路:
有了求二叉树深度的经验之后再解决这个问题,很容易想到一种思路,在遍历树的灭个节点的时候,从上到下调用函数求左右子树的深度。如果每个节点的左右子树深度相差不超过过1,则为平衡二叉树。
然而这个方法右缺点:由于一个节点会被重复遍历多次,这种思路的时间效率不高。
考虑用后序遍历的方式从下到上去遍历每一个节点,那么在遍历到一个节点之前我们就已经遍历了它的左右子树。
package jianZhiOffer;
import jianZhiOffer.Demo5501.BinaryTreeNode;
/*
*题目二:平衡二叉树
*输入一棵平衡二叉树的根节点,判断该树是不是平衡二叉树。
*如果某二叉树中任意节点的左右子树深度相差不超过1,那么它就是一棵平衡二叉树。
*/
public class Demo5502 {
class BinaryTreeNode{
int val;
BinaryTreeNode left;
BinaryTreeNode right;
public BinaryTreeNode(int val){
this.val = val;
}
}
public static void main(String[] args) {
Demo5502 m = new Demo5502();
BinaryTreeNode root = m.new BinaryTreeNode(1);
BinaryTreeNode a = m.new BinaryTreeNode(2);
BinaryTreeNode b = m.new BinaryTreeNode(3);
BinaryTreeNode c = m.new BinaryTreeNode(4);
BinaryTreeNode d = m.new BinaryTreeNode(5);
BinaryTreeNode e = m.new BinaryTreeNode(6);
BinaryTreeNode f = m.new BinaryTreeNode(7);
root.left = a;
root.right = b;
a.left = c;
a.right = d;
b.right = e;
d.left = f;
System.out.println(IsBalanced_Solution(root));
}
private static boolean isBalanced = true;
public static boolean IsBalanced_Solution(BinaryTreeNode root) {
getDepth(root);
return isBalanced;
}
public static int getDepth(BinaryTreeNode root) {
if(root==null)
return 0;
int left = getDepth(root.left);
int right = getDepth(root.right);
if(Math.abs(left-right)>1)
isBalanced = false;
return right>left? right+1:left+1;
}
}