在学习二叉树使用指针时遇到的奇怪问题

_拔剑四顾_ 2023-09-05 09:14:04

    在学习二叉树的时候,自己尝试写二叉树的各个实现方法:

    0.树节点的定义

#define data_type int

typedef struct tree_node
{
    data_type data;
    struct tree_node* left;
    struct tree_node* right;
} tree_node;

typedef tree_node* Pnode;
typedef tree_node* RootNode;

    1.节点初始化

Pnode tree_node_init()
{
    tree_node* tree = (tree_node*)malloc(sizeof(tree_node));
    if(tree == NULL)
    {
        perror("tree_node malloc : ");
    }
    //tree->data = 0;
    tree->left = NULL;
    tree->right = NULL;
    return tree;
}

    2.树的初始化

RootNode tree_creat(data_type data)
{
    Pnode tree;
    tree = tree_node_init();
    tree->data = data;
    return tree;
}

    3.插入节点

void node_insert(RootNode tree, data_type data)
{
    Pnode temp;
    Pnode next;
    temp = tree;
    if(tree != NULL)
    {
        if(data < temp->data)
        {
            if(temp->left != NULL)
            {
                node_insert(temp->left, data);
            }
            if(temp->left == NULL)
            {
                next = tree_node_init();
                next->data = data;
                temp->left = next;
            }
        }
        if(data > temp->data)
        {
            if(temp->right != NULL)
            {
                node_insert(temp->right, data);
            }
            if(temp->right == NULL)
            {
                next = tree_node_init();
                next->data = data;
                temp->right = next;
            }
        }
        if(data == temp->data)
        {
            temp->data = data;
        }
    }
    else
    {
        tree = tree_node_init();
        tree->data = data;
    }
}

    4.打印整棵树

void print_tree(RootNode tree)
{
    Pnode temp,left,right;
    temp = tree;
    if(tree == NULL)
    {
        printf("the tree is empty!\n");
    }
    else if (tree != NULL)
    {
        if(temp->left != NULL)
        {
            left = temp->left;
            print_tree(left);
        }
        printf("%d\n",temp->data);
        if(temp->right != NULL)
        {
            right = temp->right;
            print_tree(right);
        }
    }
}

    5.释放整棵树

RootNode free_tree(RootNode tree)
{
    Pnode temp;
    Pnode left;
    Pnode right;
    temp = tree;
    if(temp->left != NULL)
    {
        left = temp->left;
        free_tree(left);
        temp->left = NULL;
    }
    if(temp->right != NULL)
    {
        right = temp->right;
        free_tree(right);
        temp->right = NULL;
    }
    free(tree);
    tree = NULL;
    return tree;
}

6.主函数

int main()
{
    RootNode num1 = tree_creat(10);
    node_insert(num1,3);
    node_insert(num1,5);
    node_insert(num1,1);
    node_insert(num1,4);
    node_insert(num1,12);
    node_insert(num1,45);
    node_insert(num1,7);
    node_insert(num1,9);
    node_insert(num1,82);
    print_tree(num1);
    printf("--------------\n");

    print_tree(num1);
    printf("--------------\n");

    print_tree(num1);
    printf("--------------\n");

    num1 = free_tree(num1);
    print_tree(num1);
    printf("#######--------------#######");
    return 0;
}

   代码相关内容就是这些(完整代码附在末尾),在运行时遇到了问题:

   当我使用调试功能让代码逐行或逐过程运行时,输出结果正常,且结果与预期相符,结果如下:

 

    同样,与此过程相同,当我在每一次调用“打印整棵树”功能函数之前,添加一个延时函数,让其每此打印之后延时2s或3s,采取编译运行的方式,同样可以取得与调试运行相同的结果。

    当我选择不添加延时函数,直接采取编译运行的方式时,就会产生与预期不符的输出,结果如下:

     以上结果都是在VSCode 编辑器中运行所得,在我尝试更换Dev C++ 的环境后,发现更换环境后第一次编译运行可以得到正确的输出结果,但第二次开始结果就不再与预期相符。

     不清楚这是什么原因导致的,或许是由于指针的使用不当造成的,但我并没有搞明白这究竟是什么造成的,希望能够获得大佬们的解答。

     另外,在我只使用一次或两次“打印整棵树”的功能函数时,输出结果也是正确的,但当我使用上第三次该函数时结果就出现了问题,不知道是什么原因导致的。

 

    完整代码如下:

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

#define data_type int

typedef struct tree_node
{
    data_type data;
    struct tree_node* left;
    struct tree_node* right;
} tree_node;

typedef tree_node* Pnode;
typedef tree_node* RootNode;

Pnode tree_node_init();
RootNode tree_creat(data_type data);
void node_insert(RootNode tree, data_type data);
void print_tree(RootNode tree);
RootNode free_tree(RootNode tree);


int main()
{
    RootNode num1 = tree_creat(10);
    node_insert(num1,3);
    node_insert(num1,5);
    node_insert(num1,1);
    node_insert(num1,4);
    node_insert(num1,12);
    node_insert(num1,45);
    node_insert(num1,7);
    node_insert(num1,9);
    node_insert(num1,82);
    print_tree(num1);
    printf("--------------\n");

    print_tree(num1);
    printf("--------------\n");

    print_tree(num1);
    printf("--------------\n");

    num1 = free_tree(num1);
    print_tree(num1);
    printf("#######--------------#######");
    return 0;
}

Pnode tree_node_init()
{
    tree_node* tree = (tree_node*)malloc(sizeof(tree_node));
    if(tree == NULL)
    {
        perror("tree_node malloc : ");
    }
    //tree->data = 0;
    tree->left = NULL;
    tree->right = NULL;
    return tree;
}

RootNode tree_creat(data_type data)
{
    Pnode tree;
    tree = tree_node_init();
    tree->data = data;
    return tree;
}

void node_insert(RootNode tree, data_type data)
{
    Pnode temp;
    Pnode next;
    temp = tree;
    if(tree != NULL)
    {
        if(data < temp->data)
        {
            if(temp->left != NULL)
            {
                node_insert(temp->left, data);
            }
            if(temp->left == NULL)
            {
                next = tree_node_init();
                next->data = data;
                temp->left = next;
            }
        }
        if(data > temp->data)
        {
            if(temp->right != NULL)
            {
                node_insert(temp->right, data);
            }
            if(temp->right == NULL)
            {
                next = tree_node_init();
                next->data = data;
                temp->right = next;
            }
        }
        if(data == temp->data)
        {
            temp->data = data;
        }
    }
    else
    {
        tree = tree_node_init();
        tree->data = data;
    }
}

void print_tree(RootNode tree)
{
    Pnode temp,left,right;
    temp = tree;
    if(tree == NULL)
    {
        printf("the tree is empty!\n");
    }
    else if (tree != NULL)
    {
        if(temp->left != NULL)
        {
            left = temp->left;
            print_tree(left);
        }
        printf("%d\n",temp->data);
        if(temp->right != NULL)
        {
            right = temp->right;
            print_tree(right);
        }
    }
}

RootNode free_tree(RootNode tree)
{
    Pnode temp;
    Pnode left;
    Pnode right;
    temp = tree;
    if(temp->left != NULL)
    {
        left = temp->left;
        free_tree(left);
        temp->left = NULL;
    }
    if(temp->right != NULL)
    {
        right = temp->right;
        free_tree(right);
        temp->right = NULL;
    }
    free(tree);
    tree = NULL;
    return tree;
}
...全文
133 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

65,174

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧