【问题标题】:Binary Search Tree In Basic Array Format基本数组格式的二叉搜索树
【发布时间】:2014-12-17 06:21:21
【问题描述】:

我试图将一堆整数读入一个数组,然后使用一个函数将该数组作为逐个元素的输入并创建一个二叉搜索树。 bst 采用数组的形式,在 (2n+1) 数组点具有较小的元素,在 2n+2 数组点具有较大的元素。我想我大部分都在工作,但由于某种原因,我的函数中的循环不起作用。有什么解决办法??我想我只是什么都没看到。

代码::

#include <iostream>
#include <fstream>
using namespace std;


void sortArray(int arr[], int size)
{   
    int bst[50];
    bst[0] = arr[0];

    for(int b = 1; b < size - 1; b++)
    {
        int c = 0;
        do{
            if(arr[b] < bst[c])
                {
                    c = ((2 * c) + 1);
                }
            if(arr[b] > bst[c])
                {
                    c = ((2 * c) + 2);
                }
        }while(bst[c] != 0);
        bst[c] = arr[b];
    }

    for(int p = 0; p < 25; p++){
        cout << bst[p];
    }   
}    



int main(int argc, char** argv) {
int myArray[50];
int i = 0;

ifstream myfile ("tree_nodes.txt");
if (myfile.is_open())
{
    while (! myfile.eof() )
    {
        myfile >> myArray[i];
        i++;
    }
    myfile.close();
}
else cout << "Unable to open file";

for(int p = 0; p < (i); p++){
        cout << myArray[p];
    }

sortArray(myArray,i);


return 0;
}

【问题讨论】:

    标签: c++ arrays io binary-search-tree


    【解决方案1】:

    您的代码存在很多问题。

    1. 您正在创建一个不平衡的 BST,可能需要 2^N 空间来存储树。即“排序” 32 个元素,您可能需要 4GB 内存。您的 50 个元素数组只能可靠地对 4 个整数进行排序。
    2. 您依赖整数 0 来表示“无价值”。 0 不能是初始数据的一部分。
    3. int bst[50] 未初始化。内容是未知的,不是零。 int bst[50] = {};,参见例如http://www.cplusplus.com/doc/tutorial/arrays/
    4. 您的方法无法处理具有相同值的两个整数。
    5. 我的印象是,您希望最后一个for-statment 输出排序后的整数。情况也并非如此。

    简而言之:这种方法行不通。创建 BST 很棘手。我建议你研究一个已经存在的 balanced BST 实现。

    要解决 5. 你可以使用类似的东西:

    void visitAndPrintOddBST(int bst[], int index = 0){
        if (bst[index] == 0 ) return;
        visitAndPrintOddBST(bst, index*2 + 1);
        std::cout << bst[index] << std::endl;
        visitAndPrintOddBST(bst, index*2 + 2);
    }
    

    您需要某种堆栈来跟踪树中的移动。在这种方法中,这是递归调用堆栈。数组的大小也未指定,很可能超出范围。这不是好的代码。 仅用于本实验。

    【讨论】:

    • 没错。 1)我想要一个不平衡的 BST。我不关心用于排序的内存使用情况。 2) 我知道 0 不能是初始数据的一部分,我假设 0 表示为空。 3) 我可以做 int bst[50] = 0; 吗? 4)我不会有相同值的整数。 5) 抱歉,这只是为了查看文件中的整数是否会正确放入初始数组的代码。我稍后会拿出来
    • @Not_NSA_I_Swear 1) 意味着您只能可靠地对 50 个元素数组中的 5 个整数进行排序,您可以吗? 3) 见cplusplus.com/doc/tutorial/arrays。 5)我会在我的回答中编辑一个建议。
    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    相关资源
    最近更新 更多