以下所有内容来自网易云课堂——数据结构(小甲鱼版)
对于树来说,一旦可以指明他的分支数,那么就可以用链表来实现了
二叉树是应用广泛的树,因为现实世界大部分模型都只包含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 ; } }
其实二叉树的遍历就是这样!。
结合遍历去看前序创建,你是不是发现这里的代码其实非常的形象?这就是递归大法的好处!
休息了