- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个用于 AVL Tree 的 C 程序。我已经编写了创建节点、创建树、将元素插入树等的所有必要函数。一切正常,但我无法设法使 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];
这是我在树中插入数字的方法;
void avl_insert(TREE tree, unsigned long long data){
tree->root = avl_insert_recursive(tree->root, data);
}
这里是 avl_insert_recursive 函数;
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;
}
如您所见,首先将一个数字插入到一个节点中。然后将节点插入到树中。这就是为什么我有 2 个函数来删除这三个函数。第一个功能是简单地删除节点;
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' 之后放置了一个
tree_free` 函数时崩溃了。感谢您的帮助。printf
语句,但它从未执行过。因此,程序在使用
编辑:对于那些想看 node_init
函数的人,给你;
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;
}
我有一个测试函数来测试我的 AVL 树;
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;
}
这是遍历我的树的函数;
void inorder_traversal(NODE node, unsigned long long *inorder){
if (node == NULL){
return;
}
inorder_traversal(node->left, inorder);
inorder[index] = node->data;
index++;
inorder_traversal(node->right, inorder);
}
最佳答案
假设 index
是全局变量。
问题是您没有重置全局 index
。
inorder[index] = node->data;
index++;
在第一次调用 test
后,您的索引将为 10000
。
因此你访问
inorder[10000+100000] in the second `test` call.
因此在每次调用 test
后重置索引。
int main()
{
index = 0;
test("10000.txt", 10000);
index = 0;
test("100000.txt", 100000);
index = 0;
test("1000000.txt", 1000000);
index = 0;
test("10000000.txt", 10000000);
return 0;
}
关于c - 在一个函数中删除所有二叉搜索树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53579068/
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 Improve th
我在使用 fork 和 pipes 制作一个用于学习目的的简单程序时遇到了问题。我想要一个 child 向 parent 发送一些数据,然后这个( parent )再次将它发送给 child 。 结果
我正在制作一个需要同时做 3 件事的 python 脚本。什么是实现此目的的好方法,就像我听说的关于 GIL 的方法一样,我不再那么倾向于使用线程了。 脚本需要做的两件事将非常活跃,他们将有很多工作要
有没有办法运行sshd以便它可以(至少对于有限数量的登录)成功返回提示(可能是 busybox),即使 fork 不可用(例如,PID 不足)? 在我看来,这应该是可能的,例如,sshd 预 fork
我意识到 Bootstrap 将使用 v4 切换到 rem。但是,我使用的是当前版本 (v3),我想使用 rem。 原因?我希望网站上有可以为最终用户缩放字体大小的按钮。我相信最好的实现方式是使用 r
我试图在这个程序中将信息从子进程传递到父进程。这是到目前为止的代码,仍在清理它: #include #include #include #include main() { char *
我试图理解 fork 在 C 中是如何工作的,但我在某个地方误解了一些东西。 我去年遇到了一位教授给我的测试,但我无法回复它:我们有 3 个任务(进程或线程),伪代码如下: Th1 { display
我在使用 fork() 之类的东西时遇到了一些麻烦。 我正在开发一个 shell,用户可以在其中编写将像在普通普通 shell 中一样执行的命令。 我有一个像这样的主要功能: void Shell::
我有一个 Python 主进程,以及由主进程使用 os.fork() 创建的一组或多个 worker . 我需要将大型且相当复杂的数据结构从工作程序传递回主进程。您会为此推荐哪些现有库? 数据结构是列
我对这个 fork 语句很陌生,我不知道 C 程序上的 fork 方法。你能告诉我这段代码的三个可能的输出是什么吗? #include #include int main(void) {
for(i=0;i #include int main() { for(int i=0;i<2;i++) { if(fork()==0) { printf("Hi %d %d
背景 我正在用 C 语言编写一个共享库,与 LD_PRELOAD 动态链接,这意味着拦截和覆盖预加载它的应用程序的网络调用,例如 socket()、connect()、recv()、send()等 在
我是一名优秀的程序员,十分优秀!