在 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-&gt;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 和一个数组,并将所有树节点添加到一个数组中 - 顺序无关紧要的主要内容,如果未能解决你的问题,请参考以下文章

可以在多线程 DLL 的接口函数中创建线程吗?

使用AsyncTask在android中创建JSoup类

在void中创建类对象并在main中使用它[关闭]

c ++如何在原始抽象类中创建一个接受派生类输入的函数

在c++中创建了类,但在创建新对象时,编译显示:不存在默认构造函数

C中创建的窗口崩溃的原因