【Java】面试题5502:输入一棵平衡二叉树的根节点,判断该树是不是平衡二叉树

题目二:平衡二叉树

输入一棵平衡二叉树的根节点,判断该树是不是平衡二叉树。
如果某二叉树中任意节点的左右子树深度相差不超过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;
	}
	
}

猜你喜欢

转载自blog.csdn.net/weixin_38361153/article/details/89012473