前中後序遍歷非遞歸寫法

前序遍歷

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def preorderTraversal(self, root: TreeNode) -> List[int]:
        res=[]
        stack=[]
        '''由於是先遍歷根節點然後左子樹然後右子樹。所以要先訪問根節點,然後用棧先進右子樹。左邊已經遍歷完了,然後讓最後進入的右子樹出棧繼續遍歷'''
        while(root or len(stack)):
            while(root):
                res.append(root.val)
                stack.append(root.right)
                root=root.left
            root=stack.pop()
        return res
            
前序遍歷右子樹入棧

中序遍歷

class Solution:
    
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        ans=[]
        stack=[]
        '''由於是先左再中再右,就應該先讓左子樹不斷入棧 然後出來一個沒有左節點的根節點,然後遍歷右節點。'''  
        while len(stack)!=0 or root:
            while(root):                
                stack.append(root)
                root=root.left
            root=stack.pop()           
            ans.append(root.val)
            if root.right:           
            	root=root.right
            else:
            	root=None
        return ans
中序中間弄完弄右邊

後序遍歷

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def postorderTraversal(self, root: TreeNode) -> List[int]:
        stack=[]
        res=[]
        '''先左子樹,然後右子樹,然後根節點,先把左子樹入棧,然後只要右子樹爲空或者右子樹已經遍歷過,那麼就訪問出棧。然後遍歷右子樹。'''
        while(root or len(stack)):
            while(root):
                stack.append(root)
                root=root.left
            while (len(stack) and (stack[-1].right==None or stack[-1].right in res)):
                res.append(stack.pop())
            if len(stack):
                root=stack[-1].right
後序遍歷右子樹弄完弄中間


        return [i.val for i in res]
        
            
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章