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;
}