Leetcode刷题之——剑指 Offer 55 - II. 平衡二叉树

这篇博客探讨了如何判断一棵二叉树是否为平衡二叉树,提供了两种不同的算法方法。方法一是通过先序遍历,结合计算节点深度来判断;方法二是采用后序遍历并利用剪枝策略,自下而上判断。这两种方法都以树的深度差不超过1作为平衡条件,并通过递归实现。
摘要由CSDN通过智能技术生成

题目
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。

示例 1:

给定二叉树 [3,9,20,null,null,15,7]

在这里插入图片描述
返回 false 。

方法一:先序遍历 + 判断深度 (从顶至底)

一棵平衡二叉树的定义条件是,任意节点的左右子树的深度相差不超过1,也就是说一棵树是否是平衡树,那就要判断任意点的左右子树均为平衡二叉树且对应的高度差不超过1

算法分析:
abs(self.depth(root.left) - self.depth(root.right)) <= 1 :判断 当前子树 是否是平衡树;
self.isBalanced(root.left) : 先序遍历递归,判断 当前子树的左子树 是否是平衡树;
self.isBalanced(root.right) : 先序遍历递归,判断 当前子树的右子树 是否是平衡树;

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isBalanced(TreeNode root) {
        if(root==null){
            return true;
        }
        return Math.abs(depth(root.left)-depth(root.right))<2 && isBalanced(root.left) && isBalanced(root.right);

    }
    public int depth(TreeNode root){
        return root==null?0:Math.max(depth(root.left),depth(root.right))+1;
    }
}

方法二、后序遍历+剪枝
自下向上做后序遍历,若判定某棵树不是平衡树,则直接向上返回

返回值
如果左子树和右子树高度差<2,则返回该树的高度,否则返回-1,代表当前节点代表的不是平衡树

终止条件
如果root==null则返回0
如果左子树和右子树高度差>=2则返回-1
如果左子树和右子树高度差<2则返回高度值
如果左子树或者右子树高度为-1时,则向上返回-1
最后,如果根节点返回的值不是-1,则表示该树是平衡二叉树

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isBalanced(TreeNode root) {
         return recur(root)!=-1;
    }
    public int recur(TreeNode root){
        if(root==null){
            return 0;
        }
        int left = recur(root.left);
        if(left==-1){
            return -1;
        }
        int right = recur(root.right);
        if(right==-1){
            return -1;
        }
        return Math.abs(left-right)<2?Math.max(left,right)+1:-1;
    }
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值