输入一棵二叉树,判断该二叉树是否是平衡二叉树

题目描述
输入一棵二叉树,判断该二叉树是否是平衡二叉树。

该二叉树不一定是二叉搜索树

分析

每碰到一个节点,就判断以该结点为根的左右子树是否是平衡二叉树(通过求左右子树的树高),然后在判断该结点的左右子树为根的子树是否是平衡二叉树。这样就遍历树中每一个结点,对每个结点都判断是否平衡二叉树。
计算树高代码,最坏情况下单枝树的时间复杂度O(n),空间O(n)
判断是否平衡方法最坏O(n),故这种方法时间 O ( n 2 ) O(n^2) O(n2),空间 O ( n 2 ) O(n^2) O(n2)

class Solution:
    def IsBalanced_Solution(self, root):
        if not root:
            return True
        hl = self.depth(root.left)
        hr = self.depth(root.right)

        is_balance = abs(hl-hr)<2 and self.IsBalanced_Solution(root.left) and self.IsBalanced_Solution(root.right)
        return is_balance

    def depth(self, root):
        if not root:
            return 0
        
        return 1 + max(self.depth(root.left), self.depth(root.right))

s = Solution().IsBalanced_Solution(root)
print(s)

上面代码从根节点开始每次都要重复遍历子树结点,所以时间复杂度高,下面从叶节点开始,依次往上求其子树高度,如果在某一子树上不满足要求,则一路返回,不再继续遍历。时间最坏O(n),空间O(n)

class Solution:
    def IsBalanced_Solution(self, root):

        return self.depth(root) != -1

    def depth(self, root):
        if not root:
            return 0
        left = self.depth(root.left)
        if left == -1: #若左子树不满足平衡,则整个树已不是平衡二叉树了,直接返回,不处理右子树
            return -1
        right = self.depth(root.right)
        if right == -1: #与上类似
            return -1
        
        return -1 if abs(left-right) > 1 else 1 + max(left, right)

注意区分这两种方法的不同,及其解决问题思想的差别。在避免树结点的重复遍历上的启示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值