由前序序列與中序序列實現後序遍歷

二叉樹是一種特殊的樹,二叉樹只有兩個分支,分別是該節點的左兒子和右兒子。
前序遍歷:就是先遍歷根節點,然後再訪問左子樹與右子樹。遍歷子樹的時候同樣也是先遍歷根節點然後在遍歷他的左子樹與右子樹。
中序遍歷:先遍歷左子樹,在遍歷根節點,最後遍歷右子樹。
後序遍歷:先遍歷左子樹與右子樹,在遍歷根節點。
因爲有這樣的特點所以可以通過中序序列與後序或前列序列來確定一個二叉樹。
一個二叉樹的前序序列爲abdecf
後序序列爲dbeacf
由前序序列的特點我們知道前序序列第一個節點一定是該樹的根節點,這樣在中序序列中尋找與根節點相同的點,以根節點在中序序列的位置爲界限,記爲l1,左邊就是左子樹的中序遍歷,右邊就是右子樹中序遍歷,此時根節點在中序序列中的位置,就是前序序列中遍歷完左子樹加上根節點的最後一個位置,記爲l2,此時,在先序序列中除去第一個節點(因爲第一個節點是根節點,不屬於子樹),一直到l,包括l都是左子樹,而且是左子樹的前序序列。
使用上述兩個序列來還原二叉樹。
這時可以看出a是樹的根節點,在bde與dbe分別是左子樹的前序序列和中序序列,cf就是右子樹的先序序列和中序序列,這樣再以新生成的前序序列與中序序列再次進行找根節點並且分割左右子樹的操作,這樣直到兩顆子樹都只有一個節點時,此時說明這個節點是葉子節點也就是遍歷完成。
這樣一直進行下去,直到左子樹和右子樹都只剩下一個節點(這時子樹就是葉子節點,將其輸出後,這個方向的子樹就全部遍歷完全)。

void BTree::builtTree(char *s1,char *s2,int len)//s1是前序序列,s2是後序序列,len是兩個序列的長度,s1的長度一定等於s2的長度
{
    int l=0;
    if(len==0)//此時該子樹只有一個元素即爲葉子結點就可以停止現在的遞歸
    {
        return ;
    }
    for(;l<len;l++)//l恰好記錄着根節點在中序遍歷的位置,從而可以判斷出左子樹,右子樹的長度
    {
        if(s2[l]==*s1)//如果恰好遍歷子樹是隻有一個節點,那麼在l=0時就會停止,l還是0此時就說明可以停止了
        {
            break;
        }
    }

    builtTree(s1+1,s2,l);//此次遞歸爲左子樹遞歸
    builtTree(s1+l+1,s2+l+1,len-l-1);//此次遞歸爲右子樹遞歸
       cout<<*s1;//因爲我要實現的是後序遍歷,所以輸出s1在後面,中序的話在左子樹與右子樹的中間,前序在二者之前
}
發佈了15 篇原創文章 · 獲贊 0 · 訪問量 616
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章