二叉树到数组:错误的值插入到数组中

时间:2014-02-28 19:04:46

标签: c++ binary-tree

我不知道我做错了什么。我有3个函数将来自两个二叉树的数据存储到数组中。我的问题如下:一切都适用于arr2但不适用于arr1。有人知道如何解决这个问题吗?帮助将不胜感激!

编辑:第一个数组看起来还包含来自arr2和一些随机数的值。

第一个函数创建数组并调用treeToArray。

void merge(Node* n1, Node* n2){
    int l1 = getTreeSize(n1);   
    cout << "array size " << l1 << endl;
    int *arr1 = new int[l1];   
    int i = 0;
    treeToArray(n1, arr1, i);  //This array is not filled how it's supposed to be. 

    int l2 = getTreeSize(n2);
    cout << "array size " << l2 << endl;
    int *arr2 = new int[l2]; //corrected this, thanks!
    int j = 0;
    treeToArray(n2, arr2, j);

    for(int i = 0; i < l1; ++i)
        cout << "array" << arr1[i] << " ";

    merge(arr1, arr2, l1, l2);

}

treeToArray应该将Tree的数据存储到数组中。

void treeToArray(Node* n, int values[], int index) {
     if(n == NULL)
          return;

     if(n->left != NULL)
          treeToArray(n->left, values, index);

     cout << "speichere " << n->data << endl;
     values[index] = n->data;
     index++;

     if(n->right != NULL)
          treeToArray(n->right, values, index);

 }

getTreeSize返回树的大小。

 int getTreeSize(Node* n) {
      if(n == NULL) {
           return 0;
      } else {
           return (getTreeSize(n->left) + getTreeSize(n->right) + 1 ); //
      }
 }  

1 个答案:

答案 0 :(得分:1)

您的treeToArray函数采用整数索引按值,这意味着不同调用之间没有通信。

我在第一次调用中使用index的实际值注释了代码,但是如果你想跟随递归,你可以在调试器中单步执行以确认这一点。

void treeToArray(Node* n, int values[], int index) {
     // start first call with index = 0
     if(n == NULL)
          return;
     if(n->left != NULL)
          treeToArray(n->left, values, index);
     // we passed 0 to the left subtree call, and get nothing back
     // so index is still 0 here

     values[index] = n->data;
     // we just overwrote the left subtree's first element with our data
     index++;

     if(n->right != NULL)
          treeToArray(n->right, values, index);
     // the right subtree now always starts from 1 ...
}

如果您更改它以通过引用传递索引 ,则调用可以合作:

void treeToArray(Node* n, int values[], int& index) {
     // start first call with index = 0
     if(n == NULL)
          return;
     if(n->left != NULL)
          treeToArray(n->left, values, index);
     // the left subtree call used a reference to the same
     // index variable, so any modification is visible here too

     values[index] = n->data;
     // we write our node data after the left subtree
     // (using the final value of index from the left subtree call)
     index++;
     // this affects the index in any parent call

     if(n->right != NULL)
          treeToArray(n->right, values, index);
     // the right subtree also advances the same index value
}

请注意,您可以返回新索引,但这是对现有代码的较小更改。


作为参考,可以很容易地将这个函数与一些小树隔离进行单元测试,并检查预期的输出。这会在你引入第二棵树和所有其他机器之前暴露这个bug。