预排序基于数组的二叉搜索树

Posted

技术标签:

【中文标题】预排序基于数组的二叉搜索树【英文标题】:preorder an array based binary search tree 【发布时间】:2009-12-01 05:46:20 【问题描述】:

我正在尝试预订 BST 我不知道该怎么做。

【问题讨论】:

【参考方案1】:

您应该考虑使用递归方法而不是迭代方法。使用递归很容易完成树遍历(前序、中序和后序)。

The Wikipedia article on tree traversal 有一个伪代码递归算法,但它真的不多。由于您将树存储在数组中,因此您不会有节点指针,只有索引。

至于你如何知道何时到达叶节点,嗯,它们的索引将超出数组的末尾。

【讨论】:

是的,我以前看过。要按前序遍历非空二叉树,从根节点开始,在每个节点上递归执行以下操作: 1. 访问根节点。 2. 遍历左子树。 3. 遍历右子树。我怎么知道我何时完成了遍历数组中的左侧?我需要一个更好的算法。这应该不难。 =( 索引超出了数组的末尾。您可以在递归函数中传递数组的大小以及当前根的索引。【参考方案2】:

进行树遍历通常使用递归函数来完成,因为这是表达遍历的最自然的方式。

进行预购遍历非常简单。忽略细节,你有这样的事情:

void do_preorder(Tree t)

    // do something with the current tree node

    if (leftnode(t) not empty)
        do_preorder(leftnode(t));
    if (rightnode(t) not empty)
        do_preorder(rightnode(t))

如果您想变得棘手,您甚至可以创建一个通用遍历,允许您在运行时选择风味(预购、中购或后购):

void do_xorder(Tree t, Flavor f)

    if (f == PREORDER)
        handle_currentnode(t)

    if (leftnode(t) not empty)
        do_xorder(leftnode(t), f);

    if (f == INORDER)
        handle_currentnode(t)

    if (rightnode(t) not empty)
        do_xorder(rightnode(t), f)

    if (f == POSTORDER)
        handle_currentnode(t)


【讨论】:

如果你绝对不能改变这个函数,那么是的,你需要一个辅助函数。如果问题是您无法更改现有调用,您可以给父级一个默认值 (BST::displayPreOrder(ostream &out, int parent = 0))。 @R Samuel:如果您添加的重载仅在一个本身具有默认值的参数上有所不同,则所有对具有单个参数的函数方法的调用都将变得模棱两可:编译器无法确定哪个重载打电话。 @dribeas - 我的建议不是添加新功能,而是更改现有功能。【参考方案3】:

根据您的代码,您可以将 (2i + 1) 用于左孩子,将 (2i + 2) 用于右孩子。

我的建议是您应该从数组中的索引 1 开始存储元素,因为您可以将左孩子存储在 (2 * i) 索引处,将右孩子存储在 (2*i + 1) 索引处。

通过检查 (2*i > currSize) 是否为真,可以很容易地找到左孩子的结尾。

http://en.wikipedia.org/wiki/Tree_traversal

查看此链接以了解您想在树上执行的任何遍历...

【讨论】:

以上是关于预排序基于数组的二叉搜索树的主要内容,如果未能解决你的问题,请参考以下文章

手撕STL二叉搜索树

二叉搜索树

C++实现的二叉搜索树BST

史上最详细的二叉树B树,看不懂怨我

二叉树之不同的二叉搜索树[Buffalo]

C++二叉树进阶