前序
# recursively
def preorderTraversal1(self, root):
res = []
self.dfs(root, res)
return res
def dfs(self, root, res):
if root:
res.append(root.val)
self.dfs(root.left, res)
self.dfs(root.right, res)
# iteratively
class Solution:
def preorderTraversal(self, root: TreeNode) -> List[int]:
if not root:
return []
stack,ans=[root],[]
while stack:
node=stack.pop()
ans.append(node.val)
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
return ans
中序
go版本
func inorderTraversal(root *TreeNode) []int {
res, stack, cur := []int{},[]*TreeNode{},root
for len(stack) > 0 || cur != nil {
for cur != nil {
stack = append(stack, cur)
cur = cur.Left
}
node := stack[len(stack)-1]
res = append(res, node.Val)
stack = stack[:len(stack)-1]
cur = node.Right
}
return res
}
# recursively
def inorderTraversal1(self, root):
res = []
self.helper(root, res)
return res
def helper(self, root, res):
if root:
self.helper(root.left, res)
res.append(root.val)
self.helper(root.right, res)
# iteratively
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
if not root:
return []
cur,stack,ans=root,[],[]
while stack or cur:
while cur:
stack.append(cur)
cur=cur.left
cur=stack.pop()
ans.append(cur.val)
cur=cur.right
return ans
后序
# recursively
def postorderTraversal1(self, root):
res = []
self.dfs(root, res)
return res
def dfs(self, root, res):
if root:
self.dfs(root.left, res)
self.dfs(root.right, res)
res.append(root.val)
## 标准的后序迭代
class Solution:
def postorderTraversal(self, root: TreeNode) -> List[int]:
res = [] # 用来存储后序遍历节点的值
stack = []
node = root
while stack or node:
while node:
stack.append(node) # 第一次入栈的是根节点
#判断当前节点的左子树是否存在,若存在则持续左下行,若不存在就转向右子树
node = node.left if node.left is not None else node.right
#循环结束说明走到了叶子节点,没有左右子树了,该叶子节点即为当前栈顶元素,应该访问了
node = stack.pop() # 取出栈顶元素进行访问
res.append(node.val) # 将栈顶元素也即当前节点的值添加进res
# (下面的stack[-1]是执行完上面那句取出栈顶元素后的栈顶元素)
if stack and stack[-1].left == node: #若栈不为空且当前节点是栈顶元素的左节点
node = stack[-1].right ## 则转向遍历右节点
else:
node = None # 没有左子树或右子树,强迫退栈
return res
# iteratively2 保存节点遍历状态的迭代,和使用双栈,一个栈放node,一个栈放flag一样
class Solution:
def postorderTraversal(self, root):
traversal, stack = [], [(root, False)]
while stack:
node, visited = stack.pop()
if node:
if visited:
# add to result if visited
traversal.append(node.val)
else:
# post-order
stack.append((node, True))
stack.append((node.right, False))
stack.append((node.left, False))
return traversal
# iteratively3(前序遍历取反,最好不要用)
def postorderTraversal(self, root):
res, stack = [], [root]
while stack:
node = stack.pop()
if node:
res.append(node.val)
stack.append(node.left)
stack.append(node.right)
return res[::-1]
层序
go版本
func inorderTraversal(root *TreeNode) []int {
res, stack, cur := []int{},[]*TreeNode{},root
for len(stack) > 0 || cur != nil {
for cur != nil {
stack = append(stack, cur)
cur = cur.Left
}
node := stack[len(stack)-1]
res = append(res, node.Val)
stack = stack[:len(stack)-1]
cur = node.Right
}
return res
}
从第一层打印到最后一层
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root:
return []
ans=[]
cur_stack=[root]
while cur_stack:
next_stack,tmp=[],[]
for node in cur_stack:
tmp.append(node.val)
if node.left:
next_stack.append(node.left)
if node.right:
next_stack.append(node.right)
cur_stack=next_stack
## 如果是从最后一层打印到第一层,改成ans.insert(0,tmp)就好了
ans.append(tmp)
return ans