LeetCode解題之Binary Tree Preorder Traversal
原題
採用非遞歸的方法進行二叉樹的前序遍歷。
注意點:
- 無
例子:
輸入:
1
\
2
/
3
輸出: [1,2,3]
解題思路
二叉樹進行前序遍歷時,首先訪問根結點然後遍歷左子樹,最後遍歷右子樹。在遍歷左、右子樹時,仍然先訪問根結點,然後遍歷左子樹,最後遍歷右子樹。可以看出採用遞歸的方法非常簡單,如果不用遞歸,我們可以通過一個棧來輔助遍歷。在先序遍歷中,訪問完根節點,我們接着遍歷它的左子樹,它的右子樹要等左子樹遍歷完成後再遍歷,所以我們先把它存起來。而左子樹的頭節點(區別於根節點)也會有它的右子樹,這棵右子樹需要比之前的右子樹先遍歷(因爲它是根節點的左子樹中的),所以存儲採用棧的結構。當遍歷到某一個節點沒有左子樹後,我們從棧中取出右子樹節點繼續遍歷,直到遍歷完整棵樹。
AC源碼
# Definition for a binary tree node.
class TreeNode(object):
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution(object):
def preorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
stack = []
result = []
while root or stack:
if not root:
root = stack.pop()
result.append(root.val)
if root.right:
stack.append(root.right)
root = root.left
return result
if __name__ == "__main__":
None
歡迎查看我的Github (https://github.com/gavinfish/LeetCode-Python) 來獲得相關源碼。