1. 程式人生 > >二叉樹非遞迴後序遍歷演算法

二叉樹非遞迴後序遍歷演算法

與正常的非遞迴中序遍歷演算法不同於兩點:

一  比正常的中序遍歷演算法多了對資料元素的標記。

       在壓資料元素入棧(標記記為0,用來表示訪問了其左子樹)時標記,

      還有訪問完左子樹利用gettop()獲取雙親通過p=p->rchild進一步訪問右子樹(標記為1,表示訪問了該資料元素的

      右子樹)時標記。

二   在訪問完左子樹時,中序遍歷會pop出該元素,利用pop出資料訪問右子樹。而後序遍歷在遍歷完右子樹之後才會pop

       出該元素,並訪問其資料,中間的過程是利用getTop函式實現的

void postOrderNoRe(BiTree T) //後續遍歷非遞迴演算法
{
     BiTree p;
     Stack *st;
     initstack(st);
     p=T;
     int Tag[20];      //棧,用於標識從左(0)或右(1)返回 
     while (p!=NULL || !isempty(st))
     {
           while (p!=NULL)
           {
                 push(st,p);
                 Tag[st->top]=0;
                 p=p->lchild;
           }
           while (!isempty(st)&&Tag[st->top]==1)
           {
            //注意這裡使用的是while,也就是說不停迴圈把棧裡連續標記為1的節點都輸出來
          //通過上面的函式訪問完右子樹之後才會訪問該節點的資料
          //所以這個輸出函式必須放在這裡,下面的函式用來由訪問左子樹轉
          //為訪問其右子樹。而上面的函式用來判斷右子樹是否訪問結束
                 p=pop(st);
                 cout<<p->data<<"  ";
           }
           if (!isempty(st))
           {
                            p=gettop(st);
                            p=p->rchild;
                            Tag[st->top]=1;   //設定標記右子樹已經訪問 
           }
           else break;
     }
}