📜  数据结构|树遍历|问题3(1)

📅  最后修改于: 2023-12-03 15:26:09.521000             🧑  作者: Mango

数据结构 | 树遍历 | 问题3

在树遍历中,问题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

总之,后序遍历是树遍历中常用的一种方式,可以在删除二叉搜索树节点等场景中发挥作用。无论是递归还是迭代,我们都可以实现后序遍历。