[英]C - recursion not working in a Binary Search Tree
我正在 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", indent, ' ');
printf("%d\n", 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 语句中断。
为什么基本情况没有触发?
第一点:
在您的 function 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);
您的递归最终到达它在NULL
指针n1->left->right
上调用print_tree
的点,并且您通过尝试在 function 的第一个if
语句中访问n1->left->right->left
来触发分段错误。
这可能是您想要的更多
void print_tree(node_t* n, int indent) {
if(n == NULL) {
return;
}
printf("%*c", indent, ' ');
printf("%d\n", n->val);
print_tree(n->left, indent+2);
print_tree(n->right, indent+2);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.