我不知道我做错了什么。我有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 ); //
}
}
答案 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。