学习记录——day18 数据结构 树

树的存储

1、顺序存储

        对于普通的二叉树,不适合存储普通的二叉树顶序存储,一般用于存储完全二叉树而言,如果使用顺序存储,会浪费大量的存储空间,因为需要给没有节点的位置留出空间,以便于后期的插入。

        所以,一般使用链式存储。

2、链式存储

        

 3、二叉树的创建

1)节点类型创建

typedef char datatype;
//定义n节点类型
typedef struct Node
{
    datatype data;  //数据域
    struct Node* L; //左孩子指针
    struct Node* R; //右孩子指针
}Node,*BitreePtr;

2)创建二叉树

//创建二叉树
BitreePtr tree_create()
{
    char data = 0;           //节点数据
    scanf(" %c",&data);  //数据元素值
    if (data == '#')
    {
        return NULL;  //递归出口
    }

    //如果不是NULL需要申请节点
    BitreePtr p = (BitreePtr)malloc(sizeof(Node));
    if (NULL == p)
    {
        printf("节点申请失败\n");
        return NULL;
    }
    
    //将数据元素放入数据域中
    p->data = data;
    p->L = tree_create();  //递归创建左子树
    p->R = tree_create();  //递归创建右子树
     
    return p;              //返回创建好的树的地址 
}

3)先序遍历

//先序遍历
void prio_order(BitreePtr B)
{
    if (NULL == B)
    {
        return;
    }

    printf("%c\n",B->data);

    //先序遍历左子树
    prio_order(B->L);

    //先序遍历右子树
    prio_order(B->R);
    
}

4)中序遍历

//中序遍历
void in_order(BitreePtr B)
{
    if (NULL == B)
    {
        return;
    }

    //中序遍历左子树
    in_order(B->L);
    
    //输出数据域
    printf("%c\n",B->data);

    //中序遍历右子树
    in_order(B->R);
     
}

5)后序遍历

//后序遍历
void post_order(BitreePtr B)
{
    if (NULL == B)
    {
        return;
    }

    //后序遍历左子树
    post_order(B->L);

    //后序遍历右子树
    post_order(B->R);
    
    //输出数据域
    printf("%c\n",B->data);
}

6)完整代码

00.h

#ifndef DAY_18
#define DAY_18

#include <myhead.h>

typedef char datatype;
//定义n节点类型
typedef struct Node
{
    datatype data;  //数据域
    struct Node* L; //左孩子指针
    struct Node* R; //右孩子指针
}Node,*BitreePtr;

//创建二叉树
BitreePtr tree_create();

//先序遍历
void prio_order(BitreePtr B);

//中序遍历
void in_order(BitreePtr B);

//后序遍历
void post_order(BitreePtr B);
#endif // !DAY_18

00.c

#include "00.h"

//创建二叉树
BitreePtr tree_create()
{
    char data = 0;           //节点数据
    scanf(" %c",&data);  //数据元素值
    if (data == '#')
    {
        return NULL;  //递归出口
    }

    //如果不是NULL需要申请节点
    BitreePtr p = (BitreePtr)malloc(sizeof(Node));
    if (NULL == p)
    {
        printf("节点申请失败\n");
        return NULL;
    }
    
    //将数据元素放入数据域中
    p->data = data;
    p->L = tree_create();  //递归创建左子树
    p->R = tree_create();  //递归创建右子树
     
    return p;              //返回创建好的树的地址 
}

//先序遍历
void prio_order(BitreePtr B)
{
    if (NULL == B)
    {
        return;
    }

    printf("%c\n",B->data);

    //先序遍历左子树
    prio_order(B->L);

    //先序遍历右子树
    prio_order(B->R);
    
}

//中序遍历
void in_order(BitreePtr B)
{
    if (NULL == B)
    {
        return;
    }

    //中序遍历左子树
    in_order(B->L);
    
    //输出数据域
    printf("%c\n",B->data);

    //中序遍历右子树
    in_order(B->R);
     
}

//后序遍历
void post_order(BitreePtr B)
{
    if (NULL == B)
    {
        return;
    }

    //后序遍历左子树
    post_order(B->L);

    //后序遍历右子树
    post_order(B->R);
    
    //输出数据域
    printf("%c\n",B->data);
}

main.c

#include "00.h"

int main(int argc, char const *argv[])
{
    BitreePtr B = tree_create();
    if (NULL == B)
    {
        return -1;
    }

    printf("prio_order:\n");
    prio_order(B);

    printf("in_order:\n");
    in_order(B);

    printf("post_order:\n");
    post_order(B);
    
    return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值