判断平衡二叉树--java

265 篇文章 2 订阅
235 篇文章 0 订阅

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

什么是平衡二叉树

平衡二叉树,左子树和右子树的高度差不超过1,就认为是平衡二叉树。

解题思路

有两种递归解法,
第一种只需要拿到左树的高度和右树的高度,判断两树差是否大于1 就可以了
第二种是,是把问题拆分成小问题去判断,先判断左树是不是平衡的,并得出高度,再拿到右树是不是平衡的并拿到高度,组合成一颗树时,左右树高度 相差不超过1,就是平衡树。
虽然第二种稍微麻烦一点,但这种思维方式是可以帮助解决复杂问题的,把问题拆成小问题,后面会出几道比较难的题,用这种思路去解决。

递归解法一

定义一个二叉树结构

	public class Node {
		public int val;
		public Node left;
		public Node right;

		public Node(int data) {
			this.val = data;
		}
	}

第一种解题方案:

    public static boolean isBalanced1(Node head){
        if (head == null){
            return true;
        }
        boolean[]booleans = new boolean[1];
        booleans[0] = true;
        process1(head,booleans);
        return  booleans[0];
    }

    public static int process1(Node head,boolean[]booleans){
        if (!booleans[0] || head == null){
            return -1;
        }

        int left = process1(head.left,booleans);
        int right = process1(head.right,booleans);
        if (Math.abs(left - right) > 1){
            booleans[0] = false;
        }
        return Math.max(left,right)+1;
    }

递归解法二

 public static class Info{
        int height;
        boolean isBalanced;

        public Info(int height, boolean isBalanced) {
            this.height = height;
            this.isBalanced = isBalanced;
        }
    }
  /**
     * 递归
     * @param head
     * @return
     */
    public static Info process(Node head){
        if (head == null){
            return new Info(0,true);
        }
        Info leftInfo = process(head.left);
        Info rightInfo = process(head.right);
        int height = Math.max(leftInfo.height,rightInfo.height) + 1;
        boolean isBalanced = false;
        if (leftInfo.isBalanced && rightInfo.isBalanced){
            isBalanced = Math.abs(leftInfo.height-rightInfo.height) < 2 ? true : false;
        }
        return new Info(height,isBalanced);
    }

    /**
     * 递归
     * @param head
     * @return
     */
    public static boolean isBalanced(Node head){
        if (head == null){
            return true;
        }
        Info process = process(head);
        return process.isBalanced;
    }

递归判断是不是搜索二叉树

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值