如何解决C-递归在二进制搜索树中不起作用
我正在用C实现BST。如果树只有2个叶子,而中间没有叶子,则递归有效。但是,一旦深入(例如,低于3个层次),递归就会中断。
我的代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int val;
struct node* left;
struct node* right;
} node_t;
void print_tree(node_t* n,int indent) {
//base case,tree leaves
if (n->left == NULL && n->right == NULL) {
printf("%*c",indent,' ');
printf("%d\n",n->val);
} else {
//print current level
printf("%*c",n->val);
//then kids
print_tree(n->left,indent+2);
print_tree(n->right,indent+1);
}
}
int bst() {
node_t* n1;
n1 = (node_t*) malloc(sizeof(node_t));
//level 1 children
n1->val = 5;
n1->left = (node_t*) malloc(sizeof(node_t));
n1->right = (node_t*) malloc(sizeof(node_t));
//level 2 children
n1->left->val = 3;
n1->left->left = (node_t*) malloc(sizeof(node_t));
n1->left->right = NULL;
n1->right->val = 10;
n1->right->left = (node_t*) malloc(sizeof(node_t));
n1->right->right = NULL;
//level 3 children
n1->left->left->val = 1;
n1->left->left->left = NULL;
n1->left->left->right = NULL;
n1->right->left->val = 6;
n1->right->left->left = NULL;
n1->right->left->right = NULL;
print_tree(n1,0);
return 1;
}
会发生什么:
5
3
1
我想发生的事情:
5
3
1
10
6
当我在调试模式下运行时,由于某种原因,我发现基本情况永远不会触发,因此在某个时候n
本身变成了NULL
并且if语句中断了。
为什么基本情况不触发?
解决方法
第一点:
在函数print_tree
中,您正在取消引用n
而不检查它是否为NULL
。
当存在一个节点的子节点为NULL
而另一个节点的子节点不是NULL
时,这将引起麻烦。
您应该添加
if (n == NULL) return;
紧随其后
void print_tree(node_t* n,int indent) {
第二点:
行
print_tree(n->right,indent+1);
是错误的,它将使10
和6
的空格数少于预期。
应该是
print_tree(n->right,indent+2);
,
您的递归最终到达在print_tree
指针NULL
上调用n1->left->right
的地步,并且您尝试通过在第一个{{ 1}}函数的声明。
这可能是您想要的更多
n1->left->right->left
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。