1. 程式人生 > >Leetcode 104:二叉樹的最大深度(最詳細的解法!!!)

Leetcode 104:二叉樹的最大深度(最詳細的解法!!!)

給定一個二叉樹,找出其最大深度。

二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。

說明: 葉子節點是指沒有子節點的節點。

示例:
給定二叉樹 [3,9,20,null,null,15,7]

    3
   / \
  9  20
    /  \
   15   7

返回它的最大深度 3 。

解題思路

整個問題一個很簡單的思路就是使用遞迴。怎麼做呢?我們只要通過maxDepth分別計算出左子樹和右子樹的深度,比較這兩個深度,取最大值k。那麼當前這棵樹深度的最大值就變成了k + 1。So easy!!O(∩_∩)O

class Solution:
    def maxDepth
(self, root):
""" :type root: TreeNode :rtype: int """ if not root: return 0 return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1

當然我們可以寫得更加簡潔

class Solution:
    def maxDepth(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
return 0 if not root else max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1

但是還沒有結束,對於可以用遞迴解決的問題,我們都應該思考一下怎麼可以通過迭代去解決。那這個問題怎麼通過迭代解決呢?那麼我們就會用到stack,通過stack模擬上面的遞迴過程。一個較為簡單的思路就是二叉樹的層序遍歷,參看這篇Leetcode 102:二叉樹的層次遍歷(最詳細解決方案!!!) ,我們在此基礎上稍加修改就可以了。

class Solution:
    def maxDepth(self, root)
:
""" :type root: TreeNode :rtype: int """ q = [(root, 1)] result = 0 while q: node, depth = q.pop(0) if node: result = max(result, depth) q.extend([(node.left, depth + 1), (node.right, depth + 1)]) return result

如有問題,希望大家指出!!!