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

張國平發表於2020-01-15

刷刷題換換下腦子。

然後去一個刷題網站,從入門開始,沒想到python寫多了,資料結構都忘了,第一個二叉樹前序遍歷就想了好久才寫出來。這裡記錄下,也算記錄。

二叉樹前序遍歷(Binary Tree Preorder Traversal), 前序遍歷首先訪問根結點然後遍歷左子樹,最後遍歷右子樹。

如下圖所示,前序遍歷結果:ABDECF

考慮了下,要建立兩個佇列,一個放遍歷結果,一個做類似棧作用,把路過節點放入;如果當前節點左邊節點存在,讀取值並放入棧繼續去下個左節點, 如果沒有 左邊節點則去右節點,同樣操作;如果都沒有,則棧彈出最後一個節點,刪除關聯,並把棧中上一個節點作為當前節點,相當於返回走。

# 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]:
        traversalList = []
        nodeList = []
        # add the first one to node list, and travel from left node first, then right; if a node without left   #and righ sub-node, pop it from node list, then remove the link with parent node; traverlous finish as root list #is empty.
        if root != None:
            traversalList.append(root.val)
            nodeList.append(root)
            currentNode = root
            while nodeList != []:
                if currentNode.left != None:
                    currentNode = currentNode.left
                    traversalList.append(currentNode.val)
                    nodeList.append(currentNode)
                elif currentNode.right != None:
                    currentNode = currentNode.right
                    traversalList.append(currentNode.val)
                    nodeList.append(currentNode)
                else:
                    nodeList.pop()
                    if nodeList != []:
                        if nodeList[-1].right == currentNode:
                            nodeList[-1].right = None
                        elif nodeList[-1].left == currentNode:
                            nodeList[-1].left = None
                        currentNode = nodeList[-1]
        return traversalList

透過後,執行時間只能一般,想想應該有更好的方法,比如使用NP.Array 矩陣判斷。這裡就不細緻研究了

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

相關文章