【问题标题】:C - recursion not working in a Binary Search TreeC - 递归在二叉搜索树中不起作用
【发布时间】:2023-03-16 18:31:01
【问题描述】:

我在 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 语句中断了。

为什么基本情况没有触发?

【问题讨论】:

    标签: c recursion binary-search-tree


    【解决方案1】:

    您的递归最终到达它在NULL 指针n1-&gt;left-&gt;right 上调用print_tree 的点,并且您通过在函数的第一个if 语句中尝试访问n1-&gt;left-&gt;right-&gt;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);
    }
    

    【讨论】:

    • indent+1 应该是 indent+2 以匹配输出。
    【解决方案2】:

    第一点

    在您的函数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);
    

    【讨论】:

      猜你喜欢
      • 2020-09-29
      • 2013-04-14
      • 1970-01-01
      • 2014-01-02
      • 1970-01-01
      • 1970-01-01
      • 2015-06-16
      • 2018-07-30
      • 2021-07-03
      相关资源
      最近更新 更多