Leetcode 刷题日记 2021.2.15 平衡二叉树的判定

Leetcode 刷题日记

2021.2.15

题目链接:

https://leetcode-cn.com/problems/ping-heng-er-cha-shu-lcof/submissions/

问题描述:

给出一棵树的根节点,判定这棵树是否为平衡二叉树
在这里插入图片描述
在这里插入图片描述

解答1:

递归+深度计算函数

代码:

public class Solution {
    public boolean isBalanced(TreeNode root) {
        if(root == null) return true;
        else if(root.left == null && root.right == null) return true;
        else if(root.left != null && root.right == null) return maxDepth(root.left) <= 1 && isBalanced(root.left);
        else if(root.left == null && root.right != null) return maxDepth(root.right) <= 1 && isBalanced(root.right);
        else return Math.abs(maxDepth(root.left) - maxDepth(root.right)) <= 1 && isBalanced(root.left) && isBalanced(root.right); 
        
    }
    public static int maxDepth(TreeNode root) {
        if(root == null) return 0;
        else if(root.left == null && root.right == null) return 1;
        else if(root.left != null && root.right == null) return maxDepth(root.left) + 1;
        else if(root.left == null && root.right != null) return maxDepth(root.right) + 1;
        else return Math.max(maxDepth(root.left),maxDepth(root.right)) + 1;
    }
}

分析:

时间复杂度:O(nlog(n))
空间复杂度:O(n)

运行结果:

在这里插入图片描述

评注:

这是最容易想到的方法,计算深度时借用了上一道题的代码。

解答2:

上一方法的基础上进行剪枝优化
(该代码为笔者写出,但思路并非笔者原创。借鉴自https://leetcode-cn.com/problems/ping-heng-er-cha-shu-lcof/solution/mian-shi-ti-55-ii-ping-heng-er-cha-shu-cong-di-zhi/)

代码:

public class Solution {
    public boolean isBalanced(TreeNode root) {
        return maxDepth(root) != -1;
    }
    public static int maxDepth(TreeNode root) {
        if(root == null) return 0;
        //如果根节点为空,则返回0
        int leftHeight = maxDepth(root.left);
        //获取左子树的高度
        int rightHeight = maxDepth(root.right);
        //获取右子树的高度
        if(leftHeight == -1 || rightHeight == -1) return -1;
        else return Math.abs(leftHeight - rightHeight) > 1 ? -1 : Math.max(leftHeight,rightHeight) + 1;
    }
}

分析:

时间复杂度:O(n)
空间复杂度:O(n)

运行结果:

在这里插入图片描述

评注:

在上一方法的基础上进行了优化,主要是把“深度的计算”和“平衡二叉树的判定”相结合。理论上能提升运行效率,但实际上改变不明显。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值