为什么我的二叉树不打印任何内容?

时间:2019-11-01 22:13:49

标签: c binary-tree

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

代码如下:

#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)上运行并尝试使用代码块(由于使用的是相同的编译器,这可能会产生相同的结果),并且我的想法耗尽了。

2 个答案:

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