C 为什么我的二叉树没有';我什么也没印?

C 为什么我的二叉树没有';我什么也没印?,c,binary-tree,C,Binary Tree,我一直在试着按预先的顺序打印我的二叉树,我被困了一段时间,试图理解为什么我的代码不能工作。我一直在尝试调试,它似乎与我的插入函数有关,但仍然没有成功。你们能帮帮我吗 代码如下: #include <stdio.h> #include <malloc.h> #include <stdbool.h> #include <assert.h> typedef int KEY; typedef struct aux { KEY key;

我一直在试着按预先的顺序打印我的二叉树,我被困了一段时间,试图理解为什么我的代码不能工作。我一直在尝试调试,它似乎与我的插入函数有关,但仍然没有成功。你们能帮帮我吗

代码如下:

#include <stdio.h>
#include <malloc.h>
#include <stdbool.h>
#include <assert.h>

typedef int KEY;

typedef struct aux
{
    KEY key;
    struct aux* left;
    struct aux* right;
} NODE;

void iniNODE(NODE* root);
NODE* createNode(KEY key);
NODE* insertNODE(NODE* root, KEY key);
bool removeNODE(NODE* root, KEY key);
void printInOrder(NODE* root);
void printPreOrder(NODE* root);
NODE* search(NODE* root, KEY key);

void iniNODE(NODE* root)
{
    root = NULL;
}

NODE* createNode(KEY key)
{
    NODE* newNode = (NODE*) malloc(sizeof(NODE));
    newNode->key = key;
    newNode->left = newNode->right = NULL;
    return newNode;
}

NODE* insertNODE(NODE* root, KEY key)
{
    if(root == NULL)
    {
        return createNode(key);
    }

    if(key > root->key)
    {
        root->right = insertNODE(root->right, key);
    }
    else if(key < root->key)
    {
        root->left = insertNODE(root->left, key);
    }
    return root;
}

void printPreOrder(NODE* root)
{
    if(root != NULL) return;

    printf("%d | ", root->key);
    printPreOrder(root->left);
    printPreOrder(root->right);
}

NODE* search(NODE* root, KEY key)
{
    if(root->key == key || root == NULL)
    {
        return root;
    }
    if(root->key < key)
    {
        search(root->right, key);
    }

    return search(root->left, key);
}

int main()
{
    NODE NODE1;
    iniNODE(&NODE1);
    insertNODE(&NODE1, 1);
    insertNODE(&NODE1, 2);
    insertNODE(&NODE1, 3);
    insertNODE(&NODE1, 4);
    insertNODE(&NODE1, 5);
    insertNODE(&NODE1, 6);
    insertNODE(&NODE1, 7);
    printPreOrder(&NODE1);
}
#包括
#包括
#包括
#包括
typedef int键;
类型定义结构辅助
{
钥匙;
结构辅助*左;
结构辅助*右;
}节点;
节点无效(节点*根);
NODE*createNode(KEY);
节点*插入节点(节点*根,键);
bool removeNODE(节点*根,键);
作废打印顺序(节点*根);
作废打印预订单(节点*根);
节点*搜索(节点*根,键);
无效节点(节点*根)
{
root=NULL;
}
节点*createNode(键)
{
NODE*newNode=(NODE*)malloc(sizeof(NODE));
新建节点->键=键;
newNode->left=newNode->right=NULL;
返回newNode;
}
节点*插入节点(节点*根,键)
{
if(root==NULL)
{
返回createNode(键);
}
如果(键>根->键)
{
根->右=插入节点(根->右,键);
}
否则如果(键<根->键)
{
根->左=插入节点(根->左,键);
}
返回根;
}
无效打印预订单(节点*根)
{
如果(root!=NULL)返回;
printf(“%d |”,根->键);
打印预订单(根->左);
打印预订单(根->右);
}
节点*搜索(节点*根,键)
{
如果(根->键==键| |根==空)
{
返回根;
}
如果(根->键<键)
{
搜索(根->右,键);
}
返回搜索(根->左,键);
}
int main()
{
节点1;
iniNODE(&NODE1);
插入节点(&NODE1,1);
插入节点(节点1和节点2);
插入节点(节点1和节点3);
插入节点(节点1和节点4);
插入节点(节点1和节点5);
插入节点(节点1和节点6);
插入节点(节点1和节点7);
打印预订单(&NODE1);
}
这是一个二叉树的标准实现,你们可以在结构中看到。我使用gcc编译代码,并在我的终端(Windows 10)上运行,并尝试使用代码块(由于我使用的是同一个编译器,因此可能会得到相同的结果),但我没有什么想法。

因为:

if(root != NULL) return;
应该是这样的:

if(root == NULL) return;
初始化函数根本不做任何事情,结果是根节点未初始化,所以它会打印垃圾。将
root
设置为null没有任何效果,因为
root
只是指向
NODE1
的指针的副本,因此将其设置为null对
ini节点
函数之外的任何内容都没有影响

函数应如下所示:

void iniNODE(NODE* root)
{
    root->key = 0;
    root->left = root->right = NULL;
}
在这种方法中:

void printPreOrder(NODE* root)
{
    if(root != NULL) return;

    printf("%d | ", root->key);
    printPreOrder(root->left);
    printPreOrder(root->right);
}
您正在检查根是否不为null,如果为null,则直接返回而不打印任何内容。这应该是根为null时的行为,而不是相反。你的意思是说:

if(root == NULL) return;
编辑:您遇到的另一个问题是,如果
root
为null,则
insertNODE
方法不会用值替换
root
,因此,即使在调用
createNode(key)
之后,
root
仍然为null。考虑替换:

if(root == NULL)
{
    return createNode(key);
}
作者:


谢谢你的快速回答,我修改了代码,但仍然没有打印任何东西。可能是其他问题吗?很抱歉这样问,但我已经尝试了一段时间,但什么也没找到。@RyuujinWillyWillyLee它对我有效,但它有一个bug,因为根节点没有初始化。我将进行编辑以显示完整的修复。谢谢您的帮助,但我的代码仍然没有打印任何内容。你还有其他想法吗?@ryuuujinwillywillylee回答更新。希望这能解决它!这是有道理的,感谢您的努力,但仍然不起作用,我尝试在插入函数之后打印任何内容,并进行了更正,但执行没有达到打印效果。因此,我认为问题仍然存在于投票决定重新开放的地方。不止一个打字错误。
if(root == NULL)
{
    root =  createNode(key);
    return root;
}