【问题标题】:Recursive Approach is not working on Binary Search Tree递归方法不适用于二叉搜索树
【发布时间】:2018-12-01 16:30:58
【问题描述】:

我有一个 C 代码模板,我需要完成它以获得二叉搜索树,然后将其改进为 AVL 树。在代码模板中,给了我一些必要函数的声明和struct的定义。但我在使用 BST 时遇到了问题。

这是代码模板中给我的结构体;

typedef struct NODE_s *NODE;
typedef struct NODE_s
{
    NODE right;
    NODE left;
    unsigned long long data;
    int height;
} NODE_t[1];

首先,我尝试编写一个节点初始化函数。简单地说,它接受一个unsigned long long 数据作为参数,并用它来初始化一个新的唯一节点,然后返回它。我在这里感到困惑的是结构的 name 在内存分配部分的用法。这是函数;

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;

}

此后,我尝试为我的树编写一个递归插入函数。它只需要两个参数。我用注释行展示了我编写这些代码的思考方式,以使您清楚。

NODE avl_insert_recursive(NODE node, unsigned long long data){

    if( node == NULL){ // if the node is NULL, then assign the data directly to it.

        return(node_init(data)); // call the node initializer function, initialize a node with the value of data
    }

    if( data < node->data ){ // if the data is smaller than the node's data


        node->left = avl_insert_recursive(node->left, data);


    }else if( data > node->data){ // if the data is bigger than the node's data


        node->right = avl_insert_recursive(node->right, data);


    }else{ // if equality occurs, directly return the node itself.

        return node;
    }

最后,为了测试我的树,我在那边有一个函数。但是,为了在我的问题中简化它,我将选择必要的行;

 NODE node = node_init(NULL); // firstly, initializing an empty node for a recursive tree
 int i = 0;
 unsigned long long number; // The numbers will be stored in it.

 fp = fopen(fname, "r+"); // There will be a .txt consist of unsorted long numbers.

 for(i = 0; i<n; i++){

        fscanf(fp, "%llu\n", &number); // taking numbers line by line
        node = avl_insert_recursive(node,number); // inserting each number to our tree
    }

    fclose(fp);

所以作为结论,我在上面分享了必要的行和功能,并尽可能地简化它。问题是,这段代码不起作用。名为 avl_insert_recursive 的函数无法递归工作,并且在 2-3 循环后卡住,因为我使用 printf 语句检查了它。因此,如果有人可以花时间阅读这些代码行并帮助我解决这个问题,我将不胜感激。感谢您的帮助。

【问题讨论】:

  • 删除 C++ 标签,因为这里的所有东西都闻起来了 C

标签: c algorithm sorting data-structures


【解决方案1】:

您在avl_insert_recursive 中的某些路径中缺少return 语句。这会导致未定义的行为。

【讨论】:

  • 在 avl_insert_recursive 函数中究竟应该在哪里添加 return 语句?
  • @OzanYurtsever Consder:分配给avl_insert_recursive 后应该返回什么node-&gt;left
  • 在递归循环结束并到达叶子之前,它不应该返回任何东西。一旦它到达叶子,那么我们应该在 if 语句之后返回节点吗?我是真的吗?
  • @OzanYurtsever 每个调用必须返回一些东西。如果您没有 return 声明,那应该是什么?
  • 所以,在node-&gt;leftnode-&gt;right递归行之后,我需要返回一些东西。应该是node 我需要返回什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
  • 2013-04-14
  • 1970-01-01
  • 2021-07-03
  • 2019-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多