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

时间:2009-12-01 05:46:20

标签: c++ algorithm

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

3 个答案:

答案 0 :(得分:1)

您应该考虑递归方法而不是迭代方法。使用递归非常容易地完成树遍历(预订,顺序和后序)。

The Wikipedia article on tree traversal有一个伪码递归算法,但实际上并没有多少。由于您将树存储在数组中,因此您将不会拥有节点指针,只需要索引。

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

答案 1 :(得分:1)

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

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

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)

}

答案 2 :(得分:0)

根据您的代码,您可以使用(2i + 1)表示左侧,(2i + 2)表示右侧孩子。

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

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

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

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