📅  最后修改于: 2023-12-03 15:26:09.521000             🧑  作者: Mango
在树遍历中,问题3是指如何实现后序遍历(post-order traversal)。
后序遍历是先遍历左子树,再遍历右子树,最后访问根节点。对于一个二叉搜索树,后序遍历可以用来删除节点。
下面是用递归实现后序遍历的示例代码:
def postorder_traversal(root):
if not root:
return []
left = postorder_traversal(root.left)
right = postorder_traversal(root.right)
return left + right + [root.val]
如果我们不想使用递归,可以使用栈来实现后序遍历。具体来说,我们需要保存一个栈来记录遍历的节点,以及一个变量last_visited_node,记录上一个访问过的节点。我们先将根节点和None压入栈中,然后进入循环,每次取出栈顶元素,如果栈顶元素是None,说明已经访问完了某个子树,我们把上一个节点的值加入结果列表,并把last_visited_node设为上一个节点。否则,如果栈顶节点有左儿子或右儿子,我们需要先把它的左儿子或右儿子加入栈中(顺序与后序遍历相反),否则我们可以访问它本身。
下面是用迭代实现后序遍历的示例代码:
def postorder_traversal(root):
if not root:
return []
stack = [(root, False)]
last_visited_node = None
res = []
while stack:
node, visited = stack.pop()
if not node:
continue
if visited:
res.append(node.val)
last_visited_node = node
else:
stack.append((node, True))
stack.append((node.right, False))
stack.append((node.left, False))
return res
总之,后序遍历是树遍历中常用的一种方式,可以在删除二叉搜索树节点等场景中发挥作用。无论是递归还是迭代,我们都可以实现后序遍历。