資料結構—二叉樹(C語言實現)
阿新 • • 發佈:2019-01-01
以下所有內容來自網易雲課堂——資料結構(小甲魚版)
對於樹來說,一旦可以指明他的分支數,那麼就可以用連結串列來實現了
二叉樹是應用廣泛的樹,因為現實世界大部分模型都只包含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 ;
}
}
注意看switch處的三種方式,是不是隻是次序變了一下!
其實二叉樹的遍歷就是這樣!。
結合遍歷去看前序建立,你是不是發現這裡的程式碼其實非常的形象?這就是遞迴大法的好處!
休息了