树的存储
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;
}