平衡二叉树 java

题目描述

输入一棵二叉树,判断该二叉树是否是平衡二叉树。


思路:

1、重复遍历结点

参考上一题求二叉树的深度,先求出根结点的左右子树的深度,然后判断它们的深度相差不超过1,如果否,则不是一棵二叉树;如果是,再用同样的方法分别判断左子树和右子树是否为平衡二叉树,如果都是,则这就是一棵平衡二叉树。

但上面的方法在判断子树是否为平衡二叉树时,会重复遍历树的结点,不断地求子树的深度,所以效率不高。

2、遍历一遍结点

我们在遍历结点的同时记录下该结点的深度,这样就可以避免了重复访问。


public boolean IsBalanced_Solution(TreeNode root) {

		if (root == null) {
			return true;
		}

		int leftDepth = TreeDepth(root.left);
		int rightDepth = TreeDepth(root.right);

		int diff = leftDepth - rightDepth;
		if (diff > 1 || diff < -1)
			return false;

		return IsBalanced_Solution(root.left)
				&& IsBalanced_Solution(root.right);
	}

	private int TreeDepth(TreeNode root) {

		if (root == null) {
			return 0;
		}

		int leftDepth = TreeDepth(root.left);
		int rightDepth = TreeDepth(root.right);

		return leftDepth > rightDepth ? (leftDepth + 1) : (rightDepth + 1);
	}

方法2:

//后续遍历时,遍历到一个节点,其左右子树已经遍历  依次自底向上判断,每个节点只需要遍历一次

private boolean isBalanced = true;

	/**
	 * 后续遍历时,遍历到一个节点,其左右子树已经遍历 依次自底向上判断,每个节点只需要遍历一次
	 * 
	 * @param root
	 * @return
	 */
	public boolean IsBalanced_Solution1(TreeNode root) {

		getDepth(root);
		return isBalanced;
	}

	public int getDepth(TreeNode 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;

	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值