在一个函数中删除所有二进制搜索树

时间:2018-12-02 09:43:39

标签: c sorting data-structures tree

我有一个用于AVL树的C程序。我已经对创建节点,创建树,将元素插入树等所有必需的功能进行了编码。一切正常,但我无法设法使用char const* str[10] = { YES, NO, YES, NO, /* ... */ }; 函数。我希望此功能删除所有树。这是我的结构;

tree_free

这是我在树上插入数字的方式;

typedef struct NODE_s *NODE;
typedef struct NODE_s
{  
    NODE right;
    NODE left;
    unsigned long long data;
    int height;
} NODE_t[1];

typedef struct TREE_s *TREE;
typedef struct TREE_s
{
    NODE root;
} TREE_t[1];

这是avl_insert_recursive函数;

void avl_insert(TREE tree, unsigned long long data){


    tree->root = avl_insert_recursive(tree->root, data);

}

如您所见,数字首先插入一个节点。然后将该节点插入树中。这就是为什么我有2个功能可以删除这三个功能。第一个功能就是简单地删除节点;

NODE avl_insert_recursive(NODE node, unsigned long long data){

    int balance = 0;


    if( node == NULL){

        return(node_init(data));
    }

    if( data < node->data ){


        node->left = avl_insert_recursive(node->left, data);



    }else if( data > node->data){


        node->right = avl_insert_recursive(node->right, data);



    }else{

        return node;
    }

    node->height = 1 + max(local_height(node->left), local_height(node->right));

    return node;
}

然后从主要void node_free(NODE node){ if(node != NULL){ node_free(node->left); node_free(node->right); free(node); } } 函数中调用此函数;

tree_free

这就是您需要了解树的工作方式的所有代码。我在void tree_free(TREE tree){ node_free(tree->root); } tree_free`函数之后放置了printf语句。感谢您的帮助。

编辑:对于那些想了解tree_free', and it is never executed. So, the program is crashing when it comes the line with功能的人,您在这里;

node_init

我有一个测试功能来测试我的AVL树;

NODE node_init(unsigned long long data)
{

    NODE newNode = (struct NODE_s*)malloc(sizeof(struct NODE_s));
    newNode->data = data;
    newNode->right = NULL;
    newNode->left = NULL;
    newNode->height = 1; 
    return newNode;
}

这是我的主要功能;

void test(char *fname, int n)
{

// Create tree and initalized it.
TREE tree;
tree = tree_init();


//NODE node = node_init(NULL);

time_t start, end;
int avl_insertion_time = 0;

FILE *fp;
int i = 0;
unsigned long long number;

unsigned long long *inorder = (unsigned long long *)malloc(sizeof(unsigned long long)*n);
fp = fopen(fname, "r+");
time(&start);
for(i = 0; i<n; i++){
    fscanf(fp, "%llu\n", &number);
    //node = avl_insert_recursive(node,number);
    avl_insert(tree, number);
}
time(&end);
fclose(fp);
avl_insertion_time = end - start

time(&start);
inorder_traversal(tree->root, inorder);
time(&end);
printf("inorder_traversal function's time spent is %ld second for %d number of elements.(AVL insertion was %ld secs)\n", (end - start), n, avl_insertion_time);
tree_free(tree);
free(inorder);
}

这是遍历我的树的功能;

int main()
{


test("10000.txt", 10000);
test("100000.txt", 100000);
test("1000000.txt", 1000000);
test("10000000.txt", 10000000);


return 0;
}

1 个答案:

答案 0 :(得分:3)

假设return <p>...</p> 是全局变量。

问题是您没有重置全局index

index

第一次调用inorder[index] = node->data; index++; 后,您的索引将为test

因此您可以访问

10000

因此,每次调用inorder[10000+100000] in the second `test` call. 后,都要重置索引。

test