根據 中序遍曆 和 後序遍曆構造樹(Presentation)(C++)

來源:互聯網
上載者:User

標籤:contest   ges   思維   技術   tree   for   味道   rac   nbsp   

  好不容易又到周五了,周末終於可以休息休息了。寫這一篇隨筆只是心血來潮,下午問了一位朋友PAT考的如何,順便看一下他考的試題,裡面有最後一道題,是關於給出中序遍曆和後序遍曆然後求一個層次遍曆。等等,我找一下連結出來......

  1127. ZigZagging on a Tree (30):https://www.patest.cn/contests/pat-a-practise/1127

  突然想起以前學資料結構的時候如果給出一個中序遍曆和一個後序遍曆然後讓你畫出樹的結構或求出先序遍曆之類的題目,如果用筆來畫,三下五除二能夠一下子就畫出來,但關於用語言編寫出來卻從來沒有想過,真是慚愧,所以這篇隨筆的內容思維可能比較簡單低階,請大家包涵。

  所以想試一下能不能寫一寫,加之最近在補習一些演算法和資料結構之類的題目,可以作為一個練手的題目。想不到要動手之前理清一下構造的過程,最後卻有些明朗的感覺,這也是我想寫下這篇隨筆的原因,雖然簡單,但很有意義。好,說了這麼多廢話...下面開始:

  對於一棵樹的中序遍曆,根節點肯定處於遍曆結果的中間(假設這棵樹有左子樹),後序遍曆的時候根節點肯定是最後一個遍曆的元素。所以可以輕易得到根在中序遍曆中的位置,根據中序遍曆的性質,以根為中點往後遍曆到的元素就是這棵樹的右子樹元素,往前遍曆到的就是這棵樹的左子樹元素。而後續遍曆也是把這棵樹的左子樹全部遍曆完整之後再來遍曆右子樹,因此在後續遍曆中,左子樹和右子樹的元素也是有明顯的界限。而對於根節點的左節點和右節點也是同樣的道理。舉個例子

                  

所以我們從最初的遍曆順序開始,找出後續遍曆的最後一個元素在中序遍曆中的位置,然後以這個位置為重點,往右的遍曆元素為A,往左的遍曆元素為B,根據A和B的長度可以確定在後續遍曆中的遍曆元素邊界,對A和B進行上一步的操作,直到所有元素遍曆完成。代碼:

Node *getRoot(int* inorder,int* postorder,int ix,int iy,int px,int py){    Node *node = new Node(postorder[py]);    int p = findElem(inorder,postorder[py],ix,iy);    if(-1 != p){        int lix,liy,lpx,lpy,rix,riy,rpx,rpy;        if(p == iy)node->right = NULL;        else{            rix = p+1;            riy= iy;            rpy = py-1;            rpx = rpy - (riy-rix);            node->right = getRoot(inorder,postorder,rix,riy,rpx,rpy);        }        if(p == ix) node->left = NULL;        else{            lix = ix;            liy = p -1;            lpx = ix;            lpy = px + (liy-lix);            node->left = getRoot(inorder,postorder,lix,liy,lpx,lpy);        }        return node;    }else    return NULL;}void MidTraverse(Node *root){    if(NULL != root){        cout<<root->val<<" ";        MidTraverse(root->left);        MidTraverse(root->right);    }}int main(){    int count;    cin>>count;    int *inorder = new int[count];    int *postorder = new int[count];    for(int i =0;i<2;i++){        for(int j=0;j<count;j++){            int in;            cin>>in;            if(0==i) inorder[j] = in;            else postorder[j] = in;        }    }    Node *root = getRoot(inorder,postorder,0,count-1,0,count-1);    if(NULL !=root)        MidTraverse(root);}

節點定義為:

typedef struct _Node{    int val;    struct _Node *left,*right;    _Node(int _val):val(_val),left(NULL),right(NULL){}}Node;

運行代碼,最後結果在意料之內:

 

 

 

        深圳的工作壓力強行把市民的生活節奏拉的飛快,上了一周的班心緒有些煩躁,下班出了公司的門卻意外地迎來了樹葉和泥土的味道,是一場雨清澈了整片空氣。

 

根據 中序遍曆 和 後序遍曆構造樹(Presentation)(C++)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.