以下所有内容来自网易云课堂——数据结构(小甲鱼版)
对于树来说,一旦可以指明他的分支数,那么就可以用链表来实现了
二叉树是应用广泛的树,因为现实世界大部分模型都只包含0,1这两种情况,非常适合用二叉树
如下:
typedef struct BiNode
{
char content ;
struct BiNode *left;
struct BiNode *right;
}BiNode,*BiTree;
其实就是使用了两个指针的链表
OK,那如何创建二叉树呢?要先明白二叉树的遍历分为前序,中序,后序三种,现在还不太清楚的同学可以去视频里面去学一下
这里只给出按照前序创建的方式(网上说只有前序和后序可以,中序不可以,没有太思考明白为什么,如果有懂的朋友,还是希望可以教教我)
以下是一种递归的创建方式
void CreateBiTree(BiTree *T)
{
char receive ;
scanf("%c",&receive);
if(receive == '*')
{
*T = NULL ;
}
else
{
*T = (BiTree)malloc(sizeof(BiNode));
(*T)->content = receive ;
CreateBiTree(&(*T)->left);
CreateBiTree(&(*T)->right);
}
}
先按照前序遍历输入二叉树,如果是空的位置输入“*”
他的思路是这样的
假设现在一个公司分苹果,左子树是下属主领导,右子树是下属副领导,好吧,当然是主领导比副领导优先
那么他们的规律是:
老大A拿了一个,给下属主领导B打电话“来拿苹果,拿完告诉我,我再给副领导C打”
主领导B拿完,给自己的下属主领导D打电话“来拿苹果,拿完告诉我,我再给副领导E打”
...
如果自己是最底层小弟(*号表示),只能说不客气,告诉上级
自己的小弟都拿完了,那么就说我和我手下都拿完了,告诉上级
...
(可以理解成从高往低一级一级的部署任务,然后从低往高一级一级的汇报,对于每一层,无非是
自己工作,让小弟(左)工作,让小弟(右)工作,然后完成)
对应于安排任务的相应遍历方式
#define FRONT 1
#define MIDDLE 2
#define BACK 3
// .....
void show(BiTree *T,int TYPE)
{
if(*T==NULL)
{
printf("*");
return ;
}
else
{
switch(TYPE)
{
///just change the order
case FRONT:
printf("%c",(*T)->content);
show(&(*T)->left,TYPE);
show(&(*T)->right,TYPE);
break;
case MIDDLE:
show(&(*T)->left,TYPE);
printf("%c",(*T)->content);
show(&(*T)->right,TYPE);
break;
case BACK:
show(&(*T)->left,TYPE);
show(&(*T)->right,TYPE);
printf("%c",(*T)->content);
break;
}
return ;
}
}
其实二叉树的遍历就是这样!。
结合遍历去看前序创建,你是不是发现这里的代码其实非常的形象?这就是递归大法的好处!
休息了