如何从C中的整数数组构建二进制搜索树?

时间:2016-05-23 19:55:24

标签: c binary-search-tree

我尝试编写一个函数,用于从整数数组构建BST。它需要2个参数:指向数组的指针和数组的大小

  • 使用连续插入创建BST并将指针返回到树
  • 如果size为0,则返回NULL

样品;

int a[3] = {2,1,3};
return build(a, 3);

我的工作在这里,但是在递归部分有一个问题,我找不到我的错误,实际上我知道我不能正确使用for循环,但无法解决。

在我的代码中,首先我按升序改变了数组的格式,然后取中间数,然后将其设为root,然后对于左右部分,我应该做同样的事情。

顺便说一句,我有一个插入函数实现,但我不确定,我们是否需要或在构建函数中使用它。

typedef struct TreeNode{
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
} TreeNode;


TreeNode* build(int *array, int size) {
    TreeNode *root = malloc(sizeof(TreeNode));
    int a,i,j;
    int mid = size/2;
    if(size==0)
        return NULL;
    else {
        for(i=0;i<size;i++) {
            for(j=i+1;j<size;j++) {
                if(array[i] > array[j]) {
                    a = array[i];
                    array[i] = array[j];
                    array[j] = a;
                }
            }
        }
        root->val = array[mid];
        for(i=0;i<mid;i++)
            root->left = build(array, mid);
        for(i=(mid+1);i<size;i++)
            root->right = build(array, mid);
        return root;
    }
}

1 个答案:

答案 0 :(得分:0)

根据您的概念进行修改:

#include <stdio.h>
#include <stdlib.h>

typedef struct TreeNode{
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
} TreeNode;

TreeNode* build(int *array, int size) {
    if(size == 0)
        return NULL;
    else {
        TreeNode *root = malloc(sizeof(TreeNode));//in the case of return NULL there is before if-block, cause of memory leak
        int i, j, mid;
        int swap = 1;

        j = size-1;
        while(swap){//To deter a repeat of the sort
            swap = 0;
            for(i = 0; i < j; ++i) {
                if(array[i] > array[i+1]) {
                    int temp = array[i];
                    array[i] = array[i+1];
                    array[i+1] = temp;
                    swap = 1;
                }
            }
            --j;
        }
        root->val = array[mid = size / 2];
        root->left  = build(array, mid);
        root->right = build(array + mid + 1, size - mid -1);
        return root;
    }
}

void print(TreeNode *p){
    if(p){
        print(p->left);
        printf("%d ", p->val);
        print(p->right);
    }
}

int main(void){
    //test
    int a[] = {1,5,9,2,6,4,8,3,7,0};
    TreeNode *root = build(a, 10);
    print(root);
    //deallocate
    return 0;
}