給定一個二叉樹,返回它的 前序 遍歷。
示例:
輸入: [1,null,2,3]
1
\
2
/
3
輸出: [1,2,3]
思路:遞歸很簡單,這裏用迭代法,使用棧模擬計算機中的指令執行情況。
1. 先創建一個Command類,存儲一個字符串和一個樹節點,其中字符串表示什麼命令,“go”代表跳轉到某個節點,“print”表示打印輸出;
2. 由於是先序遍歷,所以跳轉到某個節點時先從棧頂彈出一條命令執行;
3. 如果彈出的命令是“print”則append進結果,如果是go命令則先向棧中壓入“go” Command中存儲的節點的右子節點命令,再壓入“go” Command中存儲的節點的左子節點命令,最後壓入“print” Command中存儲的節點的命令;
4. 最終返回結果數據即可。
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Command(object):
def __init__(self, s, node):
self.s = s
self.node = node
class Solution(object):
def preorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
if root == None:
return []
stack = []
result = []
stack.append( Command("go", root) )
while len(stack)!= 0:
command = stack.pop()
if command.s == "print":
result.append(command.node.val)
else:
if command.s == "go" and command.node.right:
stack.append( Command("go", command.node.right) )
if command.s == "go" and command.node.left:
stack.append( Command("go", command.node.left) )
stack.append( Command("print", command.node) )
return result
對於第94題的中序遍歷,只需改變入棧順序即可
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Command(object):
def __init__(self, s, node):
self.s = s
self.node = node
class Solution(object):
def inorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
if root == None:
return []
stack = []
result = []
stack.append( Command("go", root) )
while len(stack)!= 0:
command = stack.pop()
if command.s == "print":
result.append(command.node.val)
else:
if command.s == "go" and command.node.right:
stack.append( Command("go", command.node.right) )
stack.append( Command("print", command.node) )
if command.s == "go" and command.node.left:
stack.append( Command("go", command.node.left) )
return result
對於第145題的後序遍歷,只需改變入棧順序即可
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Command(object):
def __init__(self, s, node):
self.s = s
self.node = node
class Solution(object):
def postorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
if root == None:
return []
stack = []
result = []
stack.append( Command("go", root) )
while len(stack)!= 0:
command = stack.pop()
if command.s == "print":
result.append(command.node.val)
else:
stack.append( Command("print", command.node) )
if command.s == "go" and command.node.right:
stack.append( Command("go", command.node.right) )
if command.s == "go" and command.node.left:
stack.append( Command("go", command.node.left) )
return result