📜  从预遍历中查找BST的后遍历(1)

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

从预遍历中查找BST的后遍历

简介

二叉搜索树(Binary Search Tree,简称BST)是一种二叉树,它的左子树中的节点都比根节点小,右子树中的节点都比根节点大。一棵树可以有多个二叉搜索树的预遍历,但是只有一个符合要求的后遍历。本文介绍如何从二叉搜索树的预遍历中查找符合要求的后遍历。

算法

二叉搜索树的后遍历和前遍历是一样的,只不过遍历的顺序与前遍历相反。因此,我们可以从前遍历开始构造二叉搜索树,然后再进行后遍历。

具体构造过程如下:

  1. 对于当前节点,将在前遍历中的第一个元素作为节点值,并从前遍历中删除该元素;
  2. 如果当前节点存在左子树,则递归构造左子树,直到左子树为空;
  3. 如果当前节点存在右子树,则递归构造右子树,直到右子树为空;
  4. 返回当前节点。

最后,对构建好的二叉搜索树进行后遍历即可得到符合要求的后遍历。

代码示例
def construct_bst(preorder):
    if not preorder:
        return None
    root = TreeNode(preorder[0])
    i = 1
    while i < len(preorder) and preorder[i] < root.val:
        i += 1
    root.left = construct_bst(preorder[1:i])
    root.right = construct_bst(preorder[i:])
    return root

def postorder_traversal(root):
    if not root:
        return []
    return postorder_traversal(root.left) + postorder_traversal(root.right) + [root.val]

preorder = [5, 3, 1, 4, 7, 6, 8]
root = construct_bst(preorder)
postorder = postorder_traversal(root)
print(postorder)  # [1, 4, 3, 6, 8, 7, 5]

以上代码中,construct_bst函数用于构造二叉搜索树,postorder_traversal函数用于进行后遍历。输入为一个二叉搜索树的前遍历,输出为符合要求的后遍历。