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);

是错误的,它将使106的空格数少于预期。

应该是

        print_tree(n->right,indent+2);
,

您的递归最终到达在print_tree指针NULL上调用n1->left->right的地步,并且您尝试通过在第一个{{ 1}}函数的声明。

这可能是您想要的更多

n1->left->right->left

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...