java判断平衡二叉树 - Kaiqisan

大家好,都吃晚饭了吗?我是Kaiqisan,是一个已经走出社恐的一般生徒,今天还是二叉树的内容!

首先明确一个概念----何为平衡二叉树
答:左子树和右子树高度差小于等于1

所以判断一个数是否为平衡二叉树的时候需要遍历所有的子树
因为概念的限制,即使一颗树在最高的根节点处看起来是平衡的,但如果某个子树不平衡的话,那这棵树还是不平衡的!

举个例子

			1
		   / \
		  2   3
		 /   / \
		4	6   7
	   /
	  5

这棵树虽然在根节点处是平衡的(左边4右边3)
但是
在2这个子树这里却是不平衡的(左边2右边0)
所以这棵树并不是平衡二叉树

思路

每次递归遍历子树,如果遇到不平衡的二叉树直接返回,如果是平衡的,就返回当前层数+1,如果左右子树层数不同的,取最大。

以下提供两种方法

	static int process2(Tree head) {
		// 到达最下面的节点,无法往下走了,层数的统计也从这里开始
        if (head == null) {
            return 0;
        }
        int left = process2(head.left);
        // 如果遇到-1就不干了直接返回,直到根节点,下面也是一样的
        if (left == -1) {
            return -1;
        }
        int right = process2(head.right);
        if (right == -1) {
            return -1;
        }
		// 遇到不平衡子树返回-1
        if (Math.abs(left - right) > 1) {
            return -1;
        }
			
		// 如果能达到这一次,那么当前的树是平衡的,返回左右子树的最大深度+1
        return Math.max(left, right) + 1;
    }
    static ReturnData process(Tree head) {
        if (head == null) {
            return new ReturnData(true, 0);
        }

        ReturnData left = process(head.left);
        if (!left.isBalance) {
            return new ReturnData(false, 0);
        }

        ReturnData right = process(head.right);
        if (!right.isBalance) {
            return new ReturnData(false, 0);
        }

        if (Math.abs(left.h - right.h) > 1) {
            return new ReturnData(false, 0);
        }
        return new ReturnData(true, Math.max(left.h, right.h) + 1);
    }
.../* 上面的类整合所有的反馈信息,表达更加清晰 */
class ReturnData {
    public boolean isBalance;
    public int h;

    public ReturnData(boolean isBalance, int h) {
        this.isBalance = isBalance;
        this.h = h;
    }
}

总结

没有总结,记住统计树的层数的方法!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kaiqisan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值