我一直在尝试按预定顺序打印我的二叉树,而我被困了一段时间试图了解我的代码为什么不起作用。我一直在尝试调试,但似乎与插入功能有关,但仍然没有成功。你们能帮我吗?
代码如下:
#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);
}
这是二叉树的标准实现,就像您在结构中看到的那样。我使用gcc编译了代码,并在终端机(Windows 10)上运行并尝试使用代码块(由于使用的是相同的编译器,这可能会产生相同的结果),并且我的想法耗尽了。
答案 0 :(得分:1)
因此,
if(root != NULL) return;
应该是这个:
if(root == NULL) return;
并且您的初始化函数根本不执行任何操作,结果是根节点未初始化,因此它会打印垃圾。将root
设置为null无效,因为root
只是指向NODE1
的指针的副本,因此将其设置为null不会影响iniNODE
函数之外的任何内容。
函数应如下所示:
void iniNODE(NODE* root)
{
root->key = 0;
root->left = root->right = NULL;
}
答案 1 :(得分:0)
在这种方法中:
void printPreOrder(NODE* root)
{
if(root != NULL) return;
printf("%d | ", root->key);
printPreOrder(root->left);
printPreOrder(root->right);
}
您正在检查根是否不为null,如果是,则直接返回而不打印任何内容。如果根为null,则应该是这种行为,而不是相反。您是否想说:
if(root == NULL) return;
编辑:您遇到的另一个问题是,如果insertNODE
为null,则root
方法不会用值替换root
,因此即使您对createNode(key)
的呼叫,您的root
仍然为空。考虑更换:
if(root == NULL)
{
return createNode(key);
}
通过:
if(root == NULL)
{
root = createNode(key);
return root;
}