c语言实现二叉树(源码)

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

//定义二叉树的结构
typedef struct binary_tree
{
    int data;   // 节点保存的数据
    binary_tree* left; // 定义左节点指针
    binary_tree* right; // 定义右节点指针
}node;


//初始化二叉树
void insert(node** tree, int gain) //指向指针变量的指针,结果是指针tree所指向的值
{
    node* temp = NULL;
    if (!(*tree)) //判断根节点是否存在
    {
        temp = (node*)malloc(sizeof(node));
        temp->left = temp->right = NULL; //左右节点制空
        temp->data = gain; 
        *tree = temp;
        return;
    }

    if (gain < (*tree)->data) //判断是左子树
    {
        insert(&(*tree)->left, gain); //等价于 &((*tree)->left),创建左子树
    }
    else if (gain > (*tree)->data) //判断是右子树
    {
        insert(&(*tree)->right, gain);//等价于 &((*tree)->right),创建右子树
    }
}

//释放节点内存
void deltree(node* tree) 
{
    if (tree) 
    {
        deltree(tree->left);//先往左子树一直寻找
        deltree(tree->right);//再往右子树一直寻找
        free(tree); //找不到了free返回上一级
    }
}

//先序遍历
void leader(node* tree) 
{
    if (tree) 
    {
        printf("根节点 %d\n", tree->data);
        if (tree->left)
        {
            printf("%d 作为 %d 的左子树\n", tree->left->data,tree->data);
            leader(tree->left);
        }
        if(tree->right)
        {
            printf("%d 作为 %d 的右子树\n", tree->right->data,tree->data);
            leader(tree->right);
        }
    }//如果tree为空则没有递归操作
}

//中序遍历
void inorder(node* tree) 
{
    if (tree) 
    {
        if (tree->left)
        {
            printf("%d 作为 %d 的左子树\n", tree->left->data, tree->data);
            inorder(tree->left);
        }
        printf("根节点 %d\n", tree->data);
        if (tree->right)
        {
            printf("%d 作为 %d 的右子树\n", tree->right->data, tree->data);
            inorder(tree->right);
        }
    }
}

//后序遍历
void lastder(node* tree) 
{
    if (tree) 
    {
        if (tree->left)
        {
            printf("%d 作为 %d 的左子树\n", tree->left->data, tree->data);
            lastder(tree->left);
        }
        if (tree->left)
        {
            printf("%d 作为 %d 的左子树\n", tree->left->data, tree->data);
            lastder(tree->left);
        }
        printf("根节点 %d\n", tree->data);
    }
}

int main(void)
{
    node* root;
    //int i;

    root = NULL;
    //将值赋给二叉树,下面是满二叉树形式
    insert(&root, 9);
    insert(&root, 4);
    insert(&root, 15);
    insert(&root, 6);
    insert(&root, 12);
    insert(&root, 16);
    insert(&root, 2);

    printf("--------------------------前序遍历-------------------------------\n");
    leader(root);

    printf("--------------------------中序遍历-------------------------------\n");
    inorder(root);

    printf("--------------------------后序遍历-------------------------------\n");
    lastder(root);
    //lastder(root);


    //释放掉二叉树
    deltree(root);
}

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

徐徐而闻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值