数据结构与算法17、剑指Offer18-平衡二叉树(与 剑指Offer11-二叉树的深度 相关)

在这里插入图片描述
首先得知道什么是平衡二叉树?
平衡二叉树定义:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

那么我们有了第一个思路,先写一个求树深度的函数
然后对每个子树均使用该函数求深度,并且判断左右子树深度差是否大于1.

即首先判断root是否为空,如果为空,则return True,否则继续判断root的left和right子树深度差是否大于1,如果大于1,return False,否则继续递归判断root left的左右子树和root right的左右子树,如果都为True,则返回True,否则返回False。

这里需要注意的是,求深度的代码,用之前我自己的思路写,不太方便,还是直接用max函数的那个求深度的代码,好用点。

上代码:

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def IsBalanced_Solution(self, pRoot):
        # write code here
        def DFS(root):
            if root is None:
                return 0
            count = max(DFS(root.left),DFS(root.right)) + 1
            return count
            
        if pRoot is None:
            return True
        
        if abs(DFS(pRoot.left)-DFS(pRoot.right)) > 1:
            return False
        if self.IsBalanced_Solution(pRoot.left) and self.IsBalanced_Solution(pRoot.right):
            return True

        return False

这种做法有很明显的问题,在判断上层结点的时候,会多次重复遍历下层结点,增加了不必要的开销。


如果改为从下往上遍历,如果子树是平衡二叉树,则返回子树的高度;如果发现子树不是平衡二叉树,则直接停止遍历,这样至多只对每个结点访问一次。

直接看代码的注释就懂了。

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def IsBalanced_Solution(self, pRoot):
        # write code here
        def helper(root):
            if root is None:  # 这是给叶子结点的
                return 0
            left = helper(root.left)
            right = helper(root.right)
            # 左子树不平衡,或右子树不平衡,或当前树结点不平衡 直接返回-1
            if left == -1 or right == -1 or abs(left-right) > 1:
                return -1
            return 1 + max(left,right)  # 返回当前树的深度
        
        if pRoot is None:
            return True
        
        if helper(pRoot) != -1:
            return True
        else:
            return False
发布了71 篇原创文章 · 获赞 20 · 访问量 4825

猜你喜欢

转载自blog.csdn.net/qq_22795223/article/details/105611471
今日推荐