二叉樹層次遍歷隊列實現


    這念頭學藝不精就要被人鄙視,自國外某知名軟件公司面試完后,發現學過的全忘腦后了。對着面試官只能“說不知道”,“不好意思,想不起來了”。一點印象都沒了,想憋都憋不出來啊。。。

   一個簡單的層次遍歷,寫着寫着成了先序遍歷。然后就死循環了。關鍵就是那一點未透——隊列。

  二叉樹的層次遍歷,是指從二叉樹的第一層(根結點)開始,從上至下逐層遍歷。在同一層中,則按從左到右的順序對結點逐個訪問。在進行層次遍歷時,當前層結點訪問完后,再按照它們的訪問次序對各個結點的左孩子和右孩子順序訪問,這樣一層一層進行,先遇到的結點先訪問,這與隊列的操作原則比較吻合。因此,在進行層次遍歷時,可設置一個隊列結構,遍歷從二叉樹的根結點開始,首先將根結點指針入隊列,然后從對列頭取出一個元素,每取一個元素,同時執行下面兩個操作:

  (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);
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM