144. 二叉樹的前序遍歷
https://leetcode-cn.com/problems/binary-tree-preorder-traversal/
# 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]
"""
if root is None:
return []
result = []
stack = [root]
# 需要一個標誌區分每個遞歸調用棧,這裏使用null來表示
while stack:
p = stack.pop() # 訪問過的節點彈出
if p is None: # 空節點表示之前已經訪問過了,現在需要處理除了遞歸之外的內容
p = stack.pop() # 處理完了,第二次彈出節點(徹底從棧中移除)
result.append(p.val) # 此時p是null之前壓棧的一個節點,也就是上面stack.append(p)中的那個p
else:
if p.right: # 右節點先壓棧,最後處理
stack.append(p.right) # 先append的最後訪問
if p.left:
stack.append(p.left)
stack.append(p) # 當前節點重新壓棧(留着以後處理),因爲先序遍歷所以最後壓棧
stack.append(None) # 在當前節點之前加入一個空節點表示已經訪問過了
return result
94. 二叉樹的中序遍歷
https://leetcode-cn.com/problems/binary-tree-inorder-traversal/
# 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 inorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
if root is None:
return []
result = []
stack = [root]
# 需要一個標誌區分每個遞歸調用棧,這裏使用null來表示
while stack:
p = stack.pop() # 訪問過的節點彈出
if p is None: # 空節點表示之前已經訪問過了,現在需要處理除了遞歸之外的內容
p = stack.pop() # 處理完了,第二次彈出節點(徹底從棧中移除)
result.append(p.val) # 此時p是null之前壓棧的一個節點,也就是上面stack.append(p)中的那個p
else:
if p.right: # 右節點先壓棧,最後處理
stack.append(p.right) # 先append的最後訪問
stack.append(p) # 當前節點重新壓棧(留着以後處理),因爲先序遍歷所以最後壓棧
stack.append(None) # 在當前節點之前加入一個空節點表示已經訪問過了
if p.left:
stack.append(p.left)
return result
145. 二叉樹的後序遍歷
https://leetcode-cn.com/problems/binary-tree-postorder-traversal/
# 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 postorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
if root is None:
return []
result = []
stack = [root]
# 需要一個標誌區分每個遞歸調用棧,這裏使用null來表示
while stack:
p = stack.pop() # 訪問過的節點彈出
if p is None: # 空節點表示之前已經訪問過了,現在需要處理除了遞歸之外的內容
p = stack.pop() # 處理完了,第二次彈出節點(徹底從棧中移除)
result.append(p.val) # 此時p是null之前壓棧的一個節點,也就是上面stack.append(p)中的那個p
else:
stack.append(p) # 當前節點重新壓棧(留着以後處理),因爲先序遍歷所以最後壓棧
stack.append(None) # 在當前節點之前加入一個空節點表示已經訪問過了
if p.right: # 右節點先壓棧,最後處理
stack.append(p.right) # 先append的最後訪問
if p.left:
stack.append(p.left)
return result
參考題解