C++ C++;按顺序遍历的AVL到数组
我正在尝试使用顺序遍历将AVL树的键复制到预先分配的数组中。 这是我的代码:C++ C++;按顺序遍历的AVL到数组,c++,arrays,recursion,C++,Arrays,Recursion,我正在尝试使用顺序遍历将AVL树的键复制到预先分配的数组中。 这是我的代码: void traverse(Node<int>* node, int* arr, int iteration) { if (node->leftSon) { traverse(node->leftSon, arr, iteration); } std::cout << "node->key = " << node->ke
void traverse(Node<int>* node, int* arr, int iteration) {
if (node->leftSon) {
traverse(node->leftSon, arr, iteration);
}
std::cout << "node->key = " << node->key << " ";
*(arr) = node->key;
std::cout << "arr = " << *(arr) << " "<<"iteration = "<<iteration<<"\n";
arr++;
iteration++;
if (node->rightSon) {
traverse(node->rightSon, arr,iteration);
}
}
/*****************************************************/
int main() {
Node<int> n1 = Node<int>(1);
AVL<int> tree = AVL<int>(&n1);
tree.insert(2);
tree.insert(21);
tree.insert(12);
tree.insert(20);
tree.insert(22);
int size = tree.getSize() + 1;
std::cout << "size = " << size << " root = "<<tree.getRoot()->key << "\n";
int* arr = (int*) malloc(size * sizeof(int));
traverse(tree.getRoot(), arr, 0);
std::cout <<"\n**************printing array:*********\n";
for (int i = 0; i < size; ++i) {
std::cout << arr[i] << "\n";
}
return 0;
}
问题:我无法理解这种奇怪的行为,因为在遍历
函数中,插入到arr
的值是正确的,也在正确的单元格中,但是我不明白为什么在主
函数中我得到了这种奇怪的输出?
这两个递归调用对此有影响吗
注意:变量
迭代
根本不起任何关键作用,我只是将其用于调试目的。。。。除了需要作为指针的iteration
参数外,您还通过值传递arr
参数
当您递归调用traverse()
时,arr
的递归调用有自己的指针副本。它继续并递增,这很好,但这与父调用程序中的arr
参数完全无关,它仍然有自己的arr
参数。当递归调用返回时,原始遍历()将拾取指针的原始值
我建议也使用迭代
的参考,如下所示:
void traverse(Node<int>* node, int* &arr, int &iteration)
void遍历(Node*Node,int*&arr,int&iteration)
。。。或者是某种变化。最初,您必须以稍微不同的方式调用traverse()
然后,遍历()的每次递归调用都会在相同的指针值上涂鸦,而不是它自己的副本。问题是,我应该将
迭代
声明为指向整数的指针,并使用它来更新arr
,即*(arr+*iteration)=value
更新代码:
void traverse(Node<int>* node, int* arr, int* iteration) {
if (node->leftSon) {
traverse(node->leftSon, arr, iteration);
}
std::cout << "node->key = " << node->key << " ";
*(arr + *iteration) = node->key;
std::cout << "arr = " << *(arr) << " "<<"iteration = "<<*iteration<<"\n";
*iteration +=1;
if (node->rightSon) {
traverse(node->rightSon, arr,iteration);
}
}
/*****************************************************/
int main() {
Node<int> n1 = Node<int>(1);
AVL<int> tree = AVL<int>(&n1);
tree.insert(2);
tree.insert(21);
tree.insert(12);
tree.insert(20);
tree.insert(22);
int size = tree.getSize() + 1;
std::cout << "size = " << size << " root = "<<tree.getRoot()->key << "\n";
int* arr = (int*) malloc(size * sizeof(int));
int a = 0;
traverse(tree.getRoot(), arr, &a);
std::cout <<"\n**************printing array:*********\n";
for (int i = 0; i < size; ++i) {
std::cout << *(arr + i) << "\n";
}
return 0;
}
然而参数
arr
仍然应该是int*
而不是int**
你是说`int**arr`(不是`int*&arr`)?关于迭代
你是对的。请看我在回答问题时所做的修改。抱歉打扰了:)我是说int*&arr;这实际上不会导致对traverse()的任何更改。请不要在问题标题中添加[已解决]。这没用。@Talonmes,谢谢你的提示,我以后会记住的。
void traverse(Node<int>* node, int* arr, int* iteration) {
if (node->leftSon) {
traverse(node->leftSon, arr, iteration);
}
std::cout << "node->key = " << node->key << " ";
*(arr + *iteration) = node->key;
std::cout << "arr = " << *(arr) << " "<<"iteration = "<<*iteration<<"\n";
*iteration +=1;
if (node->rightSon) {
traverse(node->rightSon, arr,iteration);
}
}
/*****************************************************/
int main() {
Node<int> n1 = Node<int>(1);
AVL<int> tree = AVL<int>(&n1);
tree.insert(2);
tree.insert(21);
tree.insert(12);
tree.insert(20);
tree.insert(22);
int size = tree.getSize() + 1;
std::cout << "size = " << size << " root = "<<tree.getRoot()->key << "\n";
int* arr = (int*) malloc(size * sizeof(int));
int a = 0;
traverse(tree.getRoot(), arr, &a);
std::cout <<"\n**************printing array:*********\n";
for (int i = 0; i < size; ++i) {
std::cout << *(arr + i) << "\n";
}
return 0;
}
size = 6 root = 20
node->key = 1 arr = 1 iteration = 0
node->key = 2 arr = 1 iteration = 1
node->key = 12 arr = 1 iteration = 2
node->key = 20 arr = 1 iteration = 3
node->key = 21 arr = 1 iteration = 4
node->key = 22 arr = 1 iteration = 5
**************printing array:*********
1
2
12
20
21
22