資料結構之樹的層次遍歷(附帶查詢)、深度求值
阿新 • • 發佈:2019-02-15
二叉樹的層次遍歷,顧名思義就是指從二叉樹的第一層(根節點)開始,從上至下逐層遍歷,在同一層中,則按照從左到右的順序對節點逐個訪問。
演算法思想:用一個佇列儲存被訪問的當前節點的左右孩子以實現層序遍歷。
在進行層次遍歷的時候,設定一個佇列結構,遍歷從二叉樹的根節點開始,首先將根節點指標入佇列,然後從隊頭取出一個元素,每取一個元素,執行下面兩個操作:
1、訪問該元素所指向的節點
2、若該元素所指節點的左右孩子節點非空,則將該元素所指節點的左孩子指標和右孩子指標順序入隊。此過程不斷進行,當佇列為空時,二叉樹的層次遍歷結束。
程式碼
#include<stdio.h>
#include<malloc.h>
#define max 100
typedef struct tree
{
char data;
struct tree*lchild;
struct tree*rchild;
}bitree;
bitree*creat()
{
bitree*t;
t=(bitree*)malloc(sizeof(bitree));
char a;
if((a=getchar())=='0')
t=NULL;
else {
t->data=a;
t->lchild=creat();
t->rchild=creat();
}
return t;
}
void print(bitree*t)
{
if(t!=NULL)
{
printf("%c",t->data);
if(t->lchild!=NULL||t->rchild!=NULL)
{
printf("(");
print(t->lchild);
if(t->rchild!=NULL)
printf(",");
print(t->rchild);
printf (")");
}
}
}
int bitreedepth(bitree*t)
{
int ldep,rdep;
if(t==NULL)
return 0;
else {
ldep=bitreedepth(t->lchild);
rdep=bitreedepth(t->rchild);
if(ldep>rdep)
return ldep+1;
else return rdep+1;
}
}
int levelprint(bitree*t,char x)
{
int flag=0;
bitree*q[max];
int front=-1,rear=0;
if(t==NULL)
return 0;
q[rear]=t;
while(front!=rear)
{
front++;
printf("%c",q[front]->data);
if(q[front]->data==x)
flag=1;
if(q[front]->lchild!=NULL)
{
rear++;
q[rear]=q[front]->lchild;
}
if(q[front]->rchild!=NULL)
{
rear++;
q[rear]=q[front]->rchild;
}
}
return flag;
}
int main()
{
bitree*t;
printf("input the bitree:");
t=creat();
putchar('\n');
print(t);
int c=bitreedepth(t);
printf("\nthe bitree depth:%d",c);
fflush(stdin);
char a;
printf("\nyou want to find:");scanf("%c",&a);
int b;
b=levelprint(t,a);
if(b)
puts("\nyou get it");
else puts("\nyou don't get it");
free(t);
return 0;
}
注意:0代表的是NULL
使用說明:本程式碼,含有levelprint函式,可以層次列印,順便查詢一下關鍵值。bitreedepth函式計算二叉樹的深度,使用的是遞迴的思想。
總結
本次實驗的目的是二叉樹的應用,樹的深度求值使用遞迴不算複雜。對於一個無序二叉樹而言,層次遍歷可以做到對無序二叉樹的查詢,當然,遞迴應該也是可以的,但我沒有做出來,下次有機會再來好好探究一下。