目录
一、树的概念
如果数据和数据之间满足一对多的关系,将其逻辑结构称之为树
如下图:树的根与树的分支存在一对多的关系
将上图具体化,从根节点开始,每个节点都有一个或者多个分支,当然还有没有分支的情况
二、树结点之间的关系
三、二叉树
二叉树是树的一种特殊形式,即每个分支最多只有两个子结点
1、满二叉树
每个结点的度都为2,即每个结点都有两个子节点,(即二叉树中每个结点的子结点都是满的)
2、完全二叉树
四、二叉树的存储
1、顺序存储
2、链式存储
使用链式存储方式实现二叉树的创建和遍历,创建如下图的二叉树
//二叉树的应用
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
//创建根节点
struct tree_node
{
char date;
struct tree_node *left;//左树指针
struct tree_node *right;//右树指针
};
//先序创建
//利用递归创建二叉树,返回类型为下一个结点的地址,实现递归创建
struct tree_node * tree_create()
{
struct tree_node *node=NULL;//创建一个指针存放节点地址,初始化为空
char str;//用来存储创建的数据
scanf(" %c",&str);//从终端获取要创建的二叉树
if(str=='#')//如果接受到字符#,即这个结点没有
return NULL;
node=(struct tree_node*)malloc(sizeof(struct tree_node));//新创建的结点
if(node==NULL)
{
printf("结点创建失败\n");
return NULL;
}
node->date=str;
//递归创建左子树
node->left=tree_create();
//递归创建右子树
node->right=tree_create();
return node;
}
//先序遍历
bool tree_erg_fir(struct tree_node *root)
{
if(root==NULL)
{
return false;
}
printf("%c",root->date);
tree_erg_fir(root->left);
tree_erg_fir(root->right);
}
//中序遍历
bool tree_erg_middle(struct tree_node *root)
{
if(root==NULL)
{
return false;
}
tree_erg_middle(root->left);
printf("%c",root->date);
tree_erg_middle(root->right);
}
//后序遍历
bool tree_erg_behind(struct tree_node *root)
{
if(root==NULL)
{
return false;
}
tree_erg_behind(root->left);
tree_erg_behind(root->right);
printf("%c",root->date);
}
int main(int argc, const char *argv[])
{
printf("请输入二叉树,创建方式为先序创建:\n");
struct tree_node *root=tree_create();
//先序遍历
tree_erg_fir(root);
printf("\n");
//中序遍历
tree_erg_middle(root);
printf("\n");
//后序遍历
tree_erg_behind(root);
printf("\n");
return 0;
}
输出如下;
请输入二叉树,创建方式为先序创建:
ABDE###F##CM###
ABDEFCM
EDBFAMC
EDFBMCA