c - 在 C 中创建一个 void toBST 函数,它接受 2 个参数:Tree* root 和一个数组,并将所有树节点添加到一个数组中 - 顺序无关紧要
问题描述
我正在尝试在 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);
值未正确添加。你能帮我实现这个功能吗?
解决方案
第一个问题在这里:
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);
推荐阅读
- python - 如何将熊猫列动态转换为行
- android - 更改 EditText 中表情符号的色调
- python - 如何在python中以这种格式“Sun,2019年9月22日09:18:13 GMT”获取当前GMT时间
- c - 如何使用 malloc 从函数返回 char 数组
- google-cloud-platform - 从 Node.js 云函数创建 Kubernetes 作业
- c++ - 在 C++ 中添加日期,使用类
- javascript - 如何逐行打印Vue对象
- python - 基于颜色比较找到两个区域之间的匹配
- selenium - Selenium & Scrapy:最后一个 URL 覆盖其他 URL
- wordpress - 为什么我需要在 docker-compose.yml 中显式声明 env_file?