我想创建一个以先到先得的顺序存储整数的树。第一个元素存储在root,然后是root的左边,然后是右边,依此类推。为了存储整数,我尝试给它一个整数数组作为输入。
我不知道如何做到这一点。我尝试连续插入节点,但我无法继续。我创建了一个临时节点并在root的左边插入了一个元素,然后我向右插入了一个元素。现在临时节点成为左节点,但我不能在右边插入节点。
我尝试以不同的方式做到这一点,但我想我会卡住,所以我尝试了不同的方法。
实际上,我获得了一个赋值,用于在未排序的树中添加两个等于k的节点。我找到了解决方案,但问题是如何创建一个未排序的树。
void insert1( tree * root,int arr[],int n) {
if (n!=0)
root->data=arr[0];
tree * temp;
temp=root;
for(i=1;i!=n;i++) {
if(i<n) {
temp->l->data=arr[i];
i++;
}
if(i<n) {
temp->r->data=arr[i];
i++;
}
temp=temp->l;
}
答案 0 :(得分:2)
如果要按索引顺序插入整数,则需要将索引转换为从根到插入位置的路径,
0 -> ""
1 -> "L"
2 -> "R"
3 -> "LL"
4 -> "LR"
5 -> "RL"
...
然后找到从根节点插入的位置。将索引转换为路径很容易,一旦你知道它就跟着路径,但在我看来,更简单的是以不同的顺序插入整数,递归地先填充左子树,然后右边。
// get us a new pointer to a properly NULL-initialised tree
tree *newEmptyTree(void) {
tree *new = malloc(sizeof *new);
if (!new) {
fputs(stderr, "Allocation of tree* failed.");
exit(EXIT_FAILURE);
}
new->data = NULL;
new->l = NULL;
new->r = NULL;
return new;
}
// make a heap from part of an array
tree *heap_from_array(int arr[], int index, int elements) {
// when we're past the end of the array, there's nothing to do anymore
if (index >= elements) return NULL;
// Otherwise, get us a new tree
tree *this = newEmptyTree();
// store current element
this->data = arr[index];
// fill left subtree
this->l = heap_from_array(arr, 2*index + 1, elements);
// fill right
this-> r = heap_from_array(arr, 2*index + 2, elements);
// done, return the thing
return this;
}
并在
中使用它void insert1( tree * root,int arr[],int n) {
// check whether root is not NULL
if (!root) {
fputs(stderr, "Got a NULL root, can't insert.");
exit(1);
}
// now let's hope that root is a valid pointer
// first check whether the array does contain elements
if (n < 0) {
fputs(stderr, "Got no array elements, can't insert.");
exit(EXIT_FAILURE);
}
// okiedokie, get going
root->data = arr[0];
root->l = heap_from_array(arr, 1, n);
root->r = heap_from_array(arr, 2, n);
// done :D
}