c++ AVL对数组的顺序遍历
C++ AVL to array in order traversal
我试图将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**
相关文章:
- 在循环中按顺序遍历成员变量
- 二叉树级别顺序遍历在leetcode中
- 使用二叉树的关卡顺序概念的垂直顺序遍历
- 按顺序遍历 AVL 树,将值保存在数组中
- 树木中的BFS(级别顺序遍历)
- 按特定顺序遍历 NxN 矩阵的上三角形
- 执行策略如何用于C++中的顺序遍历算法
- 二叉树级别顺序遍历 LeetCode
- 如何修复关卡顺序遍历问题(二叉树)的无限循环错误
- 使用队列在二进制树中的水平顺序遍历
- 二进制树的水平顺序遍历
- 二叉树顺序遍历在C++
- 二叉树顺序遍历错误:没有用于调用的匹配函数
- 二进制搜索树中按顺序遍历的复杂性(使用迭代器)
- 如何以相反的顺序遍历 boost::d ynamic_bitset
- 关卡顺序遍历:删除子树
- 使用级别顺序遍历将节点插入二叉树
- 二叉树顺序遍历导致堆栈溢出
- 二进制搜索树,按顺序遍历,步骤3逻辑辅助
- 线程内二叉树的插入或顺序遍历有什么问题