剑指Offer:判断是不是平衡二叉树

描述
输入一棵节点数为 n 二叉树,判断该二叉树是否是平衡二叉树。
在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树
平衡二叉树(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
样例解释:
在这里插入图片描述
样例二叉树如图,为一颗平衡二叉树
注:我们约定空树是平衡二叉树。

数据范围:n \le 100n≤100,树上节点的val值满足 0 \le n \le 10000≤n≤1000
要求:空间复杂度O(1)O(1),时间复杂度 O(n)O(n)
输入描述:
输入一棵二叉树的根节点
返回值描述:
输出一个布尔类型的值

我的思路

首先,平衡二叉树就是判断这个高度的绝对值是否为[0,1]。不要再乱写代码了!一般平衡二叉树是有一个平衡因子的,所以我们现在如果没有思路可以先手写一个平衡因子,捋一下这个过程。由于我们计算的是每个节点下面有多少个节点,然后平衡因子是左树的节点数减去右树的节点,最后返回的是根节点的平衡因子。所以这里需要设置两个参数。
我一开始写的错误代码:

public boolean IsBalanced_Solution(TreeNode root) {
        if (root == null)
            return true;
        //将初始的节点和高度传进去
        if (dfs04(root,0) <= 1)
            return true;
        else
            return false;
    }
    //我是想设置两个参数,一个是本节点下面节点的个数,
    // 一个是该节点下面有几个节点,
    // 最后的平衡因子应该是根节点的左子树节点减去右子树节点的绝对值
    private int dfs04(TreeNode root, int high) {
        if (root == null)
            return 0;

        int left = dfs04(root.left,high + 1);
        //每遍历下一层high,也就算节点+1
        int right = dfs04(root.right,high +1);
        //这个也是同样的道理
        //好像无意识的用了后序
        return Math.abs(left - right);
    }

这样写也是错误的,因为它会返回你一开始调用的那个值,那不就是00了。

public boolean IsBalanced_Solution(TreeNode root) {
        if (root == null)
            return true;
        //将初始的节点和高度传进去
        if (dfs04(root,0) <= 1)
            return true;
        else
            return false;
    }
    //我是想设置两个参数,一个是本节点下面节点的个数,
    // 一个是该节点下面有几个节点,
    // 最后的平衡因子应该是根节点的左子树节点减去右子树节点的绝对值
    private int dfs04(TreeNode root, int high) {
        if (root == null)
            return 0;

        dfs04(root.left,high + 1);
        int leftHight = high;
        high = 0;
        //每遍历下一层high,也就算节点+1
        dfs04(root.right,high +1);
        int rightHight = high;
        //这个也是同样的道理
        //好像无意识的用了后序
        return Math.abs(leftHight - rightHight);
    }

这里其实不用记录high,直接在返回值+1就好了。

public boolean IsBalanced_Solution(TreeNode root) {
        if (root == null)
            return true;
        //将初始的节点和高度传进去
        if (dfs04(root) <= 1)
            return true;
        else
            return false;
    }
    //我是想设置两个参数,一个是本节点下面节点的个数,
    // 一个是该节点下面有几个节点,
    // 最后的平衡因子应该是根节点的左子树节点减去右子树节点的绝对值
    private int dfs04(TreeNode root) {
        if (root == null)
            return 0;

        int left = dfs04(root.left);
        //每遍历下一层high,也就算节点+1
        int right = dfs04(root.right);
        //这个也是同样的道理
        //好像无意识的用了后序
        return Math.abs(left - right) +1;
    }

但是还是出现问题
在这里插入图片描述
我忽略了是整棵树的深度,而不是单个左树深度或者右树深度。要记住,这个很重要。
正确运行代码:

public boolean IsBalanced_Solution(TreeNode root) {
        if (root == null)
            return true;
       
        return dfs04(root) == -1 ? false : true;
    }
   
    private int dfs04(TreeNode root) {
        if (root == null)
            return 0;

        int left = dfs04(root.left);
        
        if (left == -1)
            return -1;
        int right = dfs04(root.right);
        if (right == -1)
            return -1;
       
        return Math.abs(left - right) < 2 ? Math.max(left,right) + 1 : -1;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值