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

C++ 基于数组的二叉搜索树的预排序,c++,algorithm,C++,Algorithm,我正在试着预定一个BST 我不知道该怎么做。 你应该考虑递归方法而不是迭代方法。树遍历(前序、中序和后序)使用递归非常容易完成 有一个伪代码递归算法,但实际上没有太多。由于将树存储在数组中,因此没有节点指针,只有索引 至于如何知道何时到达叶节点,那么,它们的索引将超出数组的末尾。通常使用递归函数进行树遍历,因为这是表示遍历的最自然的方式 进行预排序遍历非常容易。忽略细节,您会遇到如下情况: void do_preorder(Tree t) { // do something with t

我正在试着预定一个BST
我不知道该怎么做。

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

有一个伪代码递归算法,但实际上没有太多。由于将树存储在数组中,因此没有节点指针,只有索引


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

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

进行预排序遍历非常容易。忽略细节,您会遇到如下情况:

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)

}

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

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

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


查看此链接,查看您想要在树上执行的任何遍历…

是的,我以前已经看过了。要按预先顺序遍历非空二叉树,请从根节点开始,在每个节点上递归执行以下操作:1。访问根。2.遍历左子树。3.遍历右子树。我怎么知道我什么时候遍历完数组中的左边?我需要一个更好的算法。这不应该很难=(索引超出了数组的末尾。您可以在递归函数中传递数组的大小以及当前根的索引。如果绝对无法更改函数,则需要帮助函数。如果问题是无法更改现有调用,则可以为父级提供默认值(BST::displayPreOrder)(ostream&out,int parent=0)).@R Samuel:如果您添加的重载仅在一个具有默认值的参数上不同,则使用单个参数对函数方法的所有调用都将变得不明确:编译器无法确定要调用哪个重载。@dribeas-我的建议不是添加新函数,而是更改现有函数。