在 C 中创建一个 void toBST 函数,它接受 2 个参数:Tree* root 和一个数组,并将所有树节点添加到一个数组中 - 顺序无关紧要
Posted
技术标签:
【中文标题】在 C 中创建一个 void toBST 函数,它接受 2 个参数:Tree* root 和一个数组,并将所有树节点添加到一个数组中 - 顺序无关紧要【英文标题】:Making a void toBST function in C which takes 2 arguments : Tree* root and an array and adds all tree nodes to an array - order does not matter 【发布时间】:2021-12-17 17:16:01 【问题描述】:我正在尝试在 C 中实现以下功能:
void BSTtoArr(Tree * root,Tree* arr[])
它采用一棵树并将其节点添加到节点数组中。 到目前为止我写的是:
void BSTtoArr(Tree * root,Tree* arr[])
static int pos = 0;
if(root == NULL) return;
BSTtoArr(root->left,arr);
v[pos++] = root->data;
BSTtoArr(root->right,arr);
我也试过
void BSTtoArr(Tree * root,Tree* arr[],int i)
if(root == NULL) return;
BSTtoArr(root->left,arr,i+1);
v[i] = root->data;
BSTtoArr(root->right,arr,i+1);
但是,当我尝试调用函数时,我无法获得添加的值
Tree* arr = (Tree*) malloc(TreeSize(root) * sizeof(Tree));
BSTtoArray(root,&arr);
值未正确添加。 你能帮我实现这个功能吗?
【问题讨论】:
欢迎来到 SO。storeBST
是什么?您的意思是递归地调用BSTtoArr
吗?另外,v
是什么?
寻求调试帮助的问题必须提供完整的代码。请提供完整的minimal reproducible example。包括准确的输入、预期结果和实际结果。
您为Tree
元素分配内存,但您的函数签名需要一个指针数组。
BSTtoArr(root->left,arr,i+1);
存储一个完整的子树。然而调用者假设只有一个数组元素会被填充。 BSTtoArr(root->right,arr,i+1);
会将另一个子树存储在完全相同的数组位置。
您的函数依赖于pos
是静态的并且在递归函数调用中更新的事实。这也意味着您只能使用该功能一次。
【参考方案1】:
第一个问题在这里:
Tree* arr = (Tree*) malloc(TreeSize(root) * sizeof(Tree));
这为您提供了 Tree
元素的“数组”,但您想要的是 指针 到 Tree
元素的“数组”。
所以改成:
Tree** arr = malloc(TreeSize(root) * sizeof *arr);
第二个问题在这里:
void BSTtoArr(Tree * root,Tree* arr[],int i)
if(root == NULL) return;
BSTtoArr(root->left,arr,i+1); <---- i+1
v[i] = root->data; <---- data ???
BSTtoArr(root->right,arr,i+1); <---- i+1
您将相同的数组索引传递给左递归和右递归,因此递归调用将写入相同的索引。您需要确保每次写入数组时都使用新的索引值。为此,您可以传递一个指向索引变量的指针,并在数组中插入新元素时更新索引。
此外,您尝试将 root->data
保存到数组中,但数组应该保存节点 - 而不是节点数据。
要解决这个问题,你可以这样做:
void BSTtoArr(Tree * root, Tree* arr[], int* i)
if(root == NULL) return;
BSTtoArr(root->left, arr, i);
v[*i] = root;
*i = *i + 1;
BSTtoArr(root->right, arr, i);
然后这样称呼它:
Tree** arr = malloc(TreeSize(root) * sizeof *arr);
int i = 0;
BSTtoArray(root, arr, &i);
【讨论】:
以上是关于在 C 中创建一个 void toBST 函数,它接受 2 个参数:Tree* root 和一个数组,并将所有树节点添加到一个数组中 - 顺序无关紧要的主要内容,如果未能解决你的问题,请参考以下文章