由遍歷序列恢復二叉樹

根據(jù)二叉樹的定義,先序遍歷是先訪問根節(jié)點,然后再先序遍歷左子樹的,最后先序遍歷右子樹。因此,先序遍歷序列中的第一個節(jié)點一定是二叉樹的根節(jié)點。此外,二叉樹的中序遍歷是先中序遍歷根節(jié)點的左子樹,然后訪問根節(jié)點,最后中序遍歷根節(jié)點的右子樹,因此,在中序遍歷序列中,根節(jié)點將序列可以分成兩個子序列,根節(jié)點左邊的是左子樹所對應的中序序列,根節(jié)點右邊的是右子樹所對應的中序序列;根據(jù)這兩個子序列可以在先序遍歷序列中找到對應的左子樹和右子樹,而此時的左子樹序列的第一個節(jié)點就是左子樹的根節(jié)點,右子樹序列的第一個節(jié)點就是右子樹的根節(jié)點,這樣就可以確定左右子樹的根節(jié)點,接下來在對左右子樹的左右子樹進行劃分,如此遞歸劃分下去,當取盡先序遍歷的節(jié)點時,就唯一恢復了這個二叉樹。
同樣,由后序遍歷和中序遍歷同樣也可以唯一的確定一個二叉樹。

先序遍歷,中序遍歷確定二叉樹

void Pre_In_Order(char pred[],char ind[],int i,int j,int k, int h,BiTNode **p){
    //i,j是前序遍歷的下,上界;k,h是中序遍歷的下,上界
    int m;
    *p=(BiTNode*)malloc(sizeof(BiTNode));
    (*p)->data=pred[i];
    m=k;
    while(pred[i]!=ind[m]){
        m++;
    } 
    if(m==k){
        //該節(jié)點的左子樹為空
        (*p)->lchild=NULL; 
    }
    else{
        Pre_In_Order(pred,ind,i+1,i+m-k,k,m-1,&(*p)->lchild);
    }
    if(m==h){
        //右子樹為空
        (*p)->rchild=NULL;
    }
    else{
        Pre_In_Order(pred,ind,i+m-k+1,j,m+1,h,&(*p)->rchild); 
    } 
} 

中序,后序確定二叉樹

void Post_In_Order(char post[],char ind[],int i,int j,int k, int h,BiTNode **p){
    //i,j是后序遍歷的下,上界;k,h是中序遍歷的下,上界
    int m;
    *p=(BiTNode*)malloc(sizeof(BiTNode));
    (*p)->data=post[j];
    m=k;
    while(post[j]!=ind[m]){
        m++;
    } 
    if(m==k){
        //該節(jié)點的左子樹為空
        (*p)->lchild=NULL; 
    }
    else{
        Post_In_Order(post,ind,i,i+m-k-1,k,m-1,&(*p)->lchild);
    }
    if(m==h){
        //右子樹為空
        (*p)->rchild=NULL;
    }
    else{
        Post_In_Order(post,ind,i+m-k,j-1,m+1,h,&(*p)->rchild); 
    } 
} 
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容