iT邦幫忙

0

leetcode with python:145. Binary Tree Postorder Traversal

  • 分享至 

  • xImage
  •  

題目:

Given the root of a binary tree, return the postorder traversal of its nodes' values.

給定一個binary tree,依後序遍歷(Postorder Traversal)的順序回傳裡面的值(用list)

又一題94.的姊妹題
一樣稍微改一下紀錄順序就能解決

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        if not root: #防範一開始給的root就是None
            return []
        
        ans=[]
        
        def dfs(root,ans):
            if root.left!=None: #先拜訪左節點
                dfs(root.left,ans)
            
            if root.right!=None: #再拜訪右節點
                dfs(root.right,ans)
            
            ans.append(root.val) #最後拜訪父節點
                
            return ans     
        return dfs(root,ans)

94.一樣以遞迴的方式走訪,並設一個空list存走訪的值
不過這次是依後序遍歷的方式走訪,順序不太一樣
一樣一個節點完全走訪後回到上一節點,不斷重複
執行完成後就獲得我們要的陣列了
最後執行時間30ms(faster than 94.31%)

一如往常,題目下面留下了挑戰

Recursive solution is trivial, could you do it iteratively?

老樣子,我們開始吧

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        if not root: #防範一開始給的root就是None
            return []
            
        ans=[]
        path=[]
        
        while True:
            if root.left: #左有枝往左探勘
                path.append(root) #將node紀錄到path內,以便回傳
                root=root.left
                
            elif root.right: #右有枝往右探勘
                path.append(root) #將node紀錄到path內,以便回傳
                root=root.right
                
            else:
                ans.append(root.val) #無枝可探勘則紀錄值
                
                if path==[]: #完全遍歷,結束程式
                    return ans
                    
                root=path.pop() #完全探索完,回上一節點
                
                if root.left: #回來若左枝在則切左枝,因為左枝在則代表我們是探索完左枝回來的
                    root.left=None
                else: #回來若左枝不在則切右枝,因為左枝不在則代表我們是探索完右枝回來的
                    root.right=None

同樣設兩個空陣列,一個紀錄走訪值(ans),一個紀錄當一個node走訪完畢後要回傳的node(path)
path同樣以stack的方式去做紀錄和取出(後進先出)
最後當path內沒東西,且也沒有枝可以探索的時候,就代表我們已經完全遍歷

上述都跟94.相似
比較不一樣的點是紀錄順序變更
且這次切枝左右都需切枝
因為要確認左右兩枝的值都已紀錄過or無左右兩枝才能紀錄父節點的值(最後紀錄父節點)
最後執行時間27ms(faster than 97.28%)

那我們下題見


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言