基本数组格式的二进制搜索树

时间:2014-12-17 06:21:22

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

我试图将一堆整数读入一个数组,然后使用一个函数将该数组作为元素的输入元素并创建一个二叉搜索树。 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;
}

1 个答案:

答案 0 :(得分:1)

您的代码存在很多问题。

  1. 您正在创建一个不平衡的BST,可能需要2 ^ N空间来存储树。 I.e to&#34; sort&#34; 32个元素你可能需要4GB的内存。您的50个元素数组只能可靠地排序4个整数。
  2. 您依靠整数0表示&#34;没有值&#34;。 0不能成为初始数据的一部分。
  3. int bst[50]未初始化。内容未知,不为零。 int bst[50] = {};,请参阅,例如http://www.cplusplus.com/doc/tutorial/arrays/
  4. 您的方法无法处理具有相同值的两个整数。
  5. 我希望最后一个for - 陈述的印象是输出排序的整数。情况也并非如此。
  6. 简而言之:这种方法不起作用。创建BST很棘手。我建议你研究一下已经存在的平衡 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);
    }
    

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