劍指offer第二版(Python3)--面試題55 :二叉樹的深度、平衡二叉樹

第2章 面試需要的基礎知識

第3章 高質量的代碼

第4章 解決面試題的思路

第5章 優化時間和空間效率

  面試題39 : 數組中出現次數超過一半的數字

  面試題40 : 最小的k個數

  面試題42 : 連續子數組的最大和

  面試題43 : 從1到n整數中1出現的次數

  面試題45 : 把數組排成最小的數

  面試題49 : 醜數

  面試題50 : 第一個只出現一次的字符

  面試題51 : 數組中的逆序對

  面試題52 : 兩個鏈表的第一個公共結點

  面試題53 : 在排序數組中查找數字

  面試題55 : 二叉樹的深度、平衡二叉樹

第6章 面試中的各項能力

第7章 兩個面試案例


題目描述
牛客網
  輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度爲樹的深度。

解題思路
方法一:
  廣度優先搜索,一層層遍歷二叉樹,每遍歷一層深度加一。

# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def TreeDepth(self, pRoot):
        # write code here
        if not pRoot:
            return 0
        
        depth = 0
        stack = [pRoot]
        while stack:
            depth += 1
            layer = []
            for node in stack:
                if node.left:
                    layer.append(node.left)
                if node.right:
                    layer.append(node.right)
            stack = layer
        
        return depth

方法二:
  深度優先搜索,利用深搜可以一次性遍歷完一條路徑。每次都進入子節點,直到葉子節點,然後比較左右葉子節點路徑長度,返回最大長度。由於遞歸需要用到系統棧,所以空間複雜度還是O(n)。

# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def TreeDepth(self, pRoot):
        # write code here
        if not pRoot:
            return 0
        
        def dfs(root, depth):
            if not root:
                return depth
            left = dfs(root.left, depth + 1)
            right = dfs(root.right, depth + 1)
            return max(left, right)
        
        return dfs(pRoot, 0)

題目描述
  輸入一棵二叉樹的根節點,判斷該樹是不是平衡二叉樹。如果某二叉樹中任意節點的左、右子樹的深度相差不超過1,那麼它就是一顆平衡二叉樹。

解題思路
  在上題的基礎上稍微修改下即可。得到兩條路徑長度後,在比較下長度差是否大於1,增加一個判斷標誌即可。

實戰

# 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
        if not pRoot:
            return True
        
        def dfs(root, depth):
            if not root:
                return depth, True
            left, flag1 = dfs(root.left, depth + 1)
            right, flag2 = dfs(root.right, depth + 1)
            
            if flag1 and flag2:
                if abs(left - right) <= 1:
                    return max(left, right), True
            return left, False
        
        depth, flag = dfs(pRoot, 0)
        return flag
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章