1. 程式人生 > >c語言實現按層次(廣度優先)非遞歸遍歷二叉鏈樹

c語言實現按層次(廣度優先)非遞歸遍歷二叉鏈樹

child str sizeof att col std 二叉樹 頭結點 oot

 1 #include<stdio.h>
 2 #include<conio.h>
4 #include<malloc.h> 5 typedef char datatype;   //字符類型 內容 6 typedef struct node{ //二叉鏈樹數據結構 7 datatype data; 8 struct node *lchild,*rchild; 9 }bitree; 10 bitree *CreatTree(){    //上一篇的建立二叉鏈樹的函數和這裏的一模一樣,歡迎看上一篇的關於建立樹的註釋 11 char
ch; 12 bitree *Q[100]; 13 int front,rear; 14 bitree *root,*s; 15 root=NULL; 16 front=1,rear=0; 17 while((ch=getchar())!=#) 18 { 19 s=NULL; 20 if(ch!=@){ 21 s=(bitree*)malloc(sizeof(bitree)); 22 s->data=ch; 23 s->lchild=NULL;
24 s->rchild=NULL; 25 } 26 rear++; 27 Q[rear]=s; 28 if(rear==1) 29 root=s; 30 else{ 31 if(s&&Q[front]){ 32 if(rear%2==0) 33 Q[front]->lchild=s; 34 else 35 Q[front]->rchild=s;
36 } 37 if(rear%2==1) 38 front++; 39 } 40 } 41 return root; 42 } 43 void BianLi(bitree *p){ //層次遍歷二叉樹的函數,其實和建立二叉樹的思想很相似,都是用到下面的“隊列數組”,p是要訪問的樹的根結點 44 bitree *Q[100]; //隊列數組,存放bitree節點指針 45 bitree *s; //當前遍歷的節點 46 int rear=1,front=0; 47 Q[rear]=p; //最先把頭結點p入隊 48 while(front<rear){ //隊列數組不為空,則進入(繼續)循環 49 front++; 50 s=Q[front]; //當前的節點入隊 51 printf("%c",s->data); //訪問元素 52 if(s->lchild!=NULL) //左孩子存在,則左孩子入隊 53 { 54 rear++; 55 Q[rear]=s->lchild; 56 } 57 if(s->rchild!=NULL) //右孩子存在,則右孩子入隊 58 { 59 rear++; 60 Q[rear]=s->rchild; 61 } 62 } 63 } 64 int main() 65 { 66 bitree *root; 67 root=CreatTree(); 68 BianLi(root); 69 return 0; 70 }
技術分享圖片
也可以把結束提示符換到下一行輸入:
技術分享圖片

c語言實現按層次(廣度優先)非遞歸遍歷二叉鏈樹