funcinorderTraversal(root *TreeNode)[]int{
res, stack, cur :=[]int{},[]*TreeNode{},root
forlen(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
}
Python版本
# recursivelydefinorderTraversal1(self, root):
res =[]
self.helper(root, res)return res
defhelper(self, root, res):if root:
self.helper(root.left, res)
res.append(root.val)
self.helper(root.right, res)# iteratively classSolution:definorderTraversal(self, root: TreeNode)-> List[int]:ifnot 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
后序
Python版本
# recursively defpostorderTraversal1(self, root):
res =[]
self.dfs(root, res)return res
defdfs(self, root, res):if root:
self.dfs(root.left, res)
self.dfs(root.right, res)
res.append(root.val)## 标准的后序迭代classSolution:defpostorderTraversal(self, root: TreeNode)-> List[int]:
res =[]# 用来存储后序遍历节点的值
stack =[]
node = root
while stack or node:while node:
stack.append(node)# 第一次入栈的是根节点#判断当前节点的左子树是否存在,若存在则持续左下行,若不存在就转向右子树
node = node.left if node.left isnotNoneelse 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一样classSolution:defpostorderTraversal(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(前序遍历取反,最好不要用) defpostorderTraversal(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]