1. 程式人生 > >資料結構之樹的層次遍歷(附帶查詢)、深度求值

資料結構之樹的層次遍歷(附帶查詢)、深度求值

二叉樹的層次遍歷,顧名思義就是指從二叉樹的第一層(根節點)開始,從上至下逐層遍歷,在同一層中,則按照從左到右的順序對節點逐個訪問。

演算法思想:用一個佇列儲存被訪問的當前節點的左右孩子以實現層序遍歷。

在進行層次遍歷的時候,設定一個佇列結構,遍歷從二叉樹的根節點開始,首先將根節點指標入佇列,然後從隊頭取出一個元素,每取一個元素,執行下面兩個操作:

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函式計算二叉樹的深度,使用的是遞迴的思想。

總結
本次實驗的目的是二叉樹的應用,樹的深度求值使用遞迴不算複雜。對於一個無序二叉樹而言,層次遍歷可以做到對無序二叉樹的查詢,當然,遞迴應該也是可以的,但我沒有做出來,下次有機會再來好好探究一下。