【问题标题】:Using a Binary Tree使用二叉树
【发布时间】:2015-06-10 07:40:00
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef struct node_{
    int val;
    struct node_ *left;
    struct node_ *right;
}node;

node* insert(node* root,int val);
void inorder(node* root);
int main(void)
{
    int i;
    int item;
    node* root = NULL;

    srand(time(NULL));

    for( i = 0; i < 10; i++)
    {
        item = rand()%15;
        insert(root,item); 
    }

    inorder(root);

    return 0;    
}

node* insert(node* root,int val)
{
    if(root == NULL)
    {
        root = malloc(sizeof(node));
        if(root!= NULL)
        {
            (root)->val = val;
            (root)->left = NULL;
            (root)->right = NULL;
        }
        else 
            printf("%d not inserted. No memory available.\n",val);
    }
    else
    {
        if(val < (root)->val)
        {
            insert((root->left),val);
        }

        if(val>root->val)
        {
            insert(((root)->right),val);
        }
    }
}

void inorder(node* root)
{
    printf("%p",root);
    if(root != NULL)
    {
        inorder(root->left);
        printf("%3d",root->val);
        inorder(root->right);
    }
}

我正在尝试创建一棵二叉树并按顺序打印出值。但是,当我运行此代码时,地址的 printf 打印出 nil 显然意味着我的树是空的,因此下面的 printf 和递归不会运行。我无法弄清楚我哪里出错了,任何建议或答案都将不胜感激,因为我无法弄清楚为什么在 main 中调用所有这些插入后根会为空。

【问题讨论】:

  • 失败的分配是否被触发了? (root) 没有意义,可能会导致问题更改为 root

标签: c binary-tree


【解决方案1】:

您将root 作为参数传递给insert()(这表示它会返回一些东西但没有)。在insertmalloc 你的节点内,并将它分配给局部变量root。您所做的任何事情都不会影响insert 函数。

尝试从 insert 返回一些内容,或使用全局 root

正如@JoshuaByer 在下面的 cmets 中所暗示的那样,另一种方法是让您的 insert 方法“通过引用传递”,这样它就可以有效地修改传递给它的内容。

void insert(node** rootp,int val)
{
    if(*rootp == NULL)
    {
        *rootp = malloc(sizeof(node));
    }
    /* and so on */

如果你不明白这是在说什么,谷歌“通过 C 中的引用传递”,我相信你会得到一些很好的信息。

【讨论】:

  • Root 不是局部变量,它是作为函数指针传入的
  • @JoshuaByer 好的,这是一个参数。语义与局部变量有何不同?它不会神奇地通过引用传递
  • 很好他想通过引用传递的问题..相应地调整答案
  • 有没有办法在不使用双指针和引用传递的情况下做到这一点?我知道怎么做,但是如果我只想使用单指针,该怎么做。
  • 实际上,我通过添加 return 语句并在 main 中具有 root = insert 但只有第一个节点被创建并打印出来
【解决方案2】:

main() 中声明和初始化 root (node* root = NULL;) 之后,您永远不会分配它。为了解决这个问题,您可能应该将 lin insert(root,item); 更改为 root = insert(root,item);

还要注意,虽然insert 被定义为返回node *,但它不返回任何值。

【讨论】:

  • 在插入中如果它为空则被赋值
  • 这个赋值没有意义,只在insert()的范围内有效。为了改变指针的值,你应该传递它的地址(即&amp;root,类型为node**),然后通过引用*ppRoot来改变它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
  • 2017-04-14
  • 2012-01-09
  • 2011-07-24
  • 1970-01-01
  • 2011-09-16
相关资源
最近更新 更多