判断二叉树是不是平衡二叉树

需要重复遍历结点的算法

	private static boolean isBalanced(Tree root) {
		if (root == null) {
			return false;
		}

		int left = getDepth(root.left);
		int right = getDepth(root.right);
		int diff = Math.abs(left - right);
		if (diff > 1) {
			return false;
		}

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

	private static int getDepth(Tree root) {
		if (root == null) {
			return 0;
		}

		int left = getDepth(root.left);
		int right = getDepth(root.right);
		int max = Math.max(left, right);
		return 1 + max;
	}
每个结点只遍历一次的解法

private static boolean isBalanced2(Tree root) {
		int[] depth = { 0 };
		return isBalanced(root, depth);
	}

	/**
	 * 使用后根遍历算法,记录每个结点的深度
	 * @param root 结点指针
	 * @param depth 当前结点的深度,由于java是传值的,无法在函数中修改传入的int,所以传int[]
	 * @return 当前结点是否是平衡结点
	 */
	private static boolean isBalanced(Tree root, int[] depth) {
		if (root == null) {
			depth[0] = 0;
			return true;
		}

		int[] left = { 0 }, right = { 0 };
		if (isBalanced(root.left, left) && isBalanced(root.right, right)) {
			int diff = Math.abs(left[0] - right[0]);
			if (diff <= 1) {
				depth[0] = 1 + Math.max(left[0], right[0]);
				return true;
			}
		}

		return false;
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值