c++ AVL对数组的顺序遍历

C++ AVL to array in order traversal

本文关键字:顺序 遍历 数组 AVL c++      更新时间:2023-10-16

我试图将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;
}

这是我的输出:

size = 6  root = 20
node->key = 1   arr = 1  iteration = 0
node->key = 2   arr = 2  iteration = 0
node->key = 12  arr = 12  iteration = 1
node->key = 20  arr = 20  iteration = 0
node->key = 21  arr = 21  iteration = 1
node->key = 22  arr = 22  iteration = 2
**************printing array:*********
20
21
22
0
0
0

问题:我无法理解这种奇怪的行为,因为在traverse函数中,插入到arr的值是正确的,并且在正确的单元格中也是如此,但是我不明白为什么在main函数中我得到了奇怪的输出?这两个递归调用对这个有影响吗?

注意:变量iteration根本没有发挥任何关键作用,我只是将其用于调试目的。

…除了iteration参数需要是一个指针,你还通过值传递arr参数。

当递归调用traverse()时,递归调用arr有自己的指针副本。它继续递增,这很好,但这与父调用者中的arr参数完全没有关系,父调用者仍然有自己的arr参数。当递归调用返回时,原始的traverse()函数将继续使用指针的原始值。

我建议使用iteration的参考,像这样:

void traverse(Node<int>* node, int* &arr, int &iteration)

…或者是。最初,您必须以一种稍微不同的方式调用traverse()

然后,每次递归调用traverse()都将在相同的指针值上涂写,而不是自己的副本。

问题是我应该将iteration声明为指向整数的指针,并使用它来更新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;
}

生成输出:

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

然而参数arr仍然应该是int*而不是int**