C++ C++;按顺序遍历的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

我正在尝试使用顺序遍历将AVL树的键复制到预先分配的数组中。 这是我的代码:

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