创建一棵二叉树,但它不起作用 - 树始终为空

标签 c data-structures binary-search-tree

我正在创建一个代码来在树中插入元素,但是 tinsert 函数没有插入;我的代码有什么问题吗?我已经检查了很多次,但树总是 NULL。

该代码只有 2 个功能:一是插入,二是按预序显示。

#include<stdio.h>
#include<stdlib.h>

struct btree {
    int val;
    struct btree *left;
    struct btree *right;
};

static int c=0;
typedef struct btree node;

void tinsert( node *n,int a)
{
    c++;
    printf("%d\n",c);
    if(n==NULL)
    {
        n=(node *)malloc(sizeof(node));
        n->left=NULL;
        n->right=NULL;
        n->val=a;
        //printf("adding root %d\n",n->val);
        //n=temp;
    }
    else if(a>=(n->val))
        tinsert(n->right,a);
    else
        tinsert(n->left,a);
    return ;
}

void preorder_display(node *n)
{
    if(n!=NULL)
    {
        printf("%d\n",n->val);
        preorder_display(n->left);
        preorder_display(n->right);
    }
    else
        printf("tree is null\n");
}

int main()
{
    //int N;
    //int num[100];
    //int i;
    node *ntree=NULL;

    tinsert(ntree,4);
    tinsert(ntree,6);
    tinsert(ntree,8);
    tinsert(ntree,1);

    printf("tree is \n");
    preorder_display(ntree);

    return 0;
}

最佳答案

tinsert 适用于 ntree 的本地副本,它不会更改 main 中的副本。您可以通过向其传递指针来修复它(即:双指针、指向指针的指针)。

所以你的tinsert看起来像这样:

void tinsert( node **n,int a)

在您的main中,您将这样调用它:

tinsert(&ntree,4);

当然,您需要调整 tinsert 中的代码以取消引用指针并正确访问它。

或者在您的main中分配根节点。

关于创建一棵二叉树,但它不起作用 - 树始终为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22433447/

相关文章:

c - 函数和字符串,检查输入字符串是否匹配

java - 在为树数据结构创建树类时是否强制使类节点静态

c++ - 在二叉搜索树中找到一个节点的父节点

data-structures - BST , Hashing , Tries 和 map 的区别

c - 为什么 exec() 函数族不执行 exec() 之后的代码?

c++ - 如何从 C/C++ 程序中找到终端列的数量?

c - 为什么 char 是唯一可以用 scanf 读入数组形式的类型?

algorithm - 高效的嵌套优先级队列

data-structures - 按添加顺序保留其键的 map

c++ - 从二叉搜索树中的 end() 迭代器递减迭代器