刷題系列 - Python用非遞迴實現二叉樹後續遍歷

張國平發表於2020-01-17

順便把Python用非遞迴實現二叉樹後續遍歷也寫了。


其實前序中序和後續都是針對父節點說的。比如下面這個最簡單二叉樹。

前序就是ABC,父節點A在前

中序就是BAC,父節點A在中間

後序就是BCA,父節點A在最後

無論多複雜二叉樹,基本都是同樣遍歷流程。


後續遍歷可以說是最簡單的,從左開始遍歷並放入棧,讀取沒有下級節點的節點值,然後把該節點推出棧,並刪除和上級節點關聯;然後替換棧中最上的點,並去遍歷右邊子節點;直到棧為空,遍歷結束。

# 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]:
        traversalList = []
        nodeList = []
        # travel the node, add to node stack, if the node without any sub-node, record the val; then remove it and it's link with parnet, travel back to last one in stack.
        if root != None:
            nodeList.append(root)
            while nodeList != []:
                if nodeList[-1].left != None:
                    nodeList.append(nodeList[-1].left )
                elif nodeList[-1].right != None:
                    nodeList.append(nodeList[-1].right)
                else:
                    traversalList.append(nodeList[-1].val)
                    currentNode = nodeList.pop()
                    if nodeList != []:
                        if nodeList[-1].right == currentNode:
                            nodeList[-1].right = None
                        elif nodeList[-1].left == currentNode:
                            nodeList[-1].left = None
        return traversalList


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22259926/viewspace-2673729/,如需轉載,請註明出處,否則將追究法律責任。

相關文章