【剑指offer Day18】55. 平衡二叉树的深度

文章介绍了如何判断一个二叉树是否是平衡二叉树,提供了两种方法:递归判断左右子树的深度和后序遍历剪枝。递归方法的时间复杂度为O(NlogN),而优化后的后序遍历方法时间复杂度为O(N)。解决方案包括两种代码实现,分别展示了这两种策略。
摘要由CSDN通过智能技术生成

【剑指offer Day18】55. 平衡二叉树的深度

原题链接

平衡二叉树的深度

分析

建议结合二叉树的深度那一题来看。
比较容易想到的做法是:递归判断左右子树是否是平衡二叉树以及两棵树深度差是否<=1。但是这种做法时间复杂度 O ( N l o g N ) O(NlogN) ONlogN.
还有一种做法是后序遍历整棵树,在搜索过程中剪枝。搜索过程中如果子树不符合要求,则不用再做其他操作,返回表示错误的状态值-1。时间复杂度更优 O ( N ) O(N) O(N)

代码

做法一:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    private int getDepth(TreeNode root){
        if(root==null) return 0;
        return Math.max(getDepth(root.left),getDepth(root.right))+1;
    } 
    public boolean isBalanced(TreeNode root) {
        if(root==null) return true;
        int d1=getDepth(root.left);
        int d2=getDepth(root.right);
        if(Math.abs(d1-d2)<=1&&isBalanced(root.left)&&isBalanced(root.right)){
            return true;
        }
        return false;
    }
}

做法二:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    private int dfs(TreeNode root){
        if(root==null) return 0;
        int d1=dfs(root.left);
        if(d1==-1) return -1;
        int d2=dfs(root.right);
        if(d2==-1) return -1;
        if(Math.abs(d1-d2)<=1) return Math.max(d1,d2)+1;
        else return -1;
    } 
    public boolean isBalanced(TreeNode root) {
        return dfs(root)!=-1;
    }
}

今日motto

习惯将成为人的第二天性。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值