這念頭學藝不精就要被人鄙視,自國外某知名軟件公司面試完后,發現學過的全忘腦后了。對着面試官只能“說不知道”,“不好意思,想不起來了”。一點印象都沒了,想憋都憋不出來啊。。。
一個簡單的層次遍歷,寫着寫着成了先序遍歷。然后就死循環了。關鍵就是那一點未透——隊列。
二叉樹的層次遍歷,是指從二叉樹的第一層(根結點)開始,從上至下逐層遍歷。在同一層中,則按從左到右的順序對結點逐個訪問。在進行層次遍歷時,當前層結點訪問完后,再按照它們的訪問次序對各個結點的左孩子和右孩子順序訪問,這樣一層一層進行,先遇到的結點先訪問,這與隊列的操作原則比較吻合。因此,在進行層次遍歷時,可設置一個隊列結構,遍歷從二叉樹的根結點開始,首先將根結點指針入隊列,然后從對列頭取出一個元素,每取一個元素,同時執行下面兩個操作:
(1)訪問該元素所指結點,也就是打印出來;
DeQueue(Q,x); //先彈出壓入隊列的節點
printf("%c",(*x)->data);
(2)若該元素所指結點的左、右孩子結點非空,則將該元素所指結點的左孩子指針和右孩子指針順序入隊。
if((*x)->lchild) //同時判斷有無左孩子節點,如果存在壓入隊列 EnQueue(Q,(*x)->lchild); if((*x)->rchild) //再判斷有無右孩子節點,如果存在壓入隊列 EnQueue(Q,(*x)->rchild);
此過程不斷進行,當隊列為空時,二叉樹的層次遍歷結束。
while(!QueueIsEmpty(Q)) //非空,一直到全部彈出為止
關鍵就是一個出隊,一個入隊操作。總代碼如下:
void LayerOrder(BiTree T) { BiTree *x; x = (BiTree*)malloc(sizeof(BiTree)); if(NULL == x) printf("內存分配失敗!\n"); LinkQueue *Q; Q = (LinkQueue*)malloc(sizeof(LinkQueue)); InitQueue(Q); //對列初始化 EnQueue(Q,T); //根節點T入棧,先壓入根節點 while(!QueueIsEmpty(Q)) //非空,一直到全部彈出為止 { DeQueue(Q,x); //彈出壓入的節點 printf("%c",(*x)->data); if((*x)->lchild) //同時判斷有無左孩子節點,如果存在壓入隊列 EnQueue(Q,(*x)->lchild); if((*x)->rchild) //再判斷有無右孩子節點,如果存在壓入隊列 EnQueue(Q,(*x)->rchild); } }