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