PTA 樹的遍歷(根據后序中序遍歷輸出層序遍歷)


 
給定一棵二叉樹的后序遍歷和中序遍歷,請你輸出其層序遍歷的序列。這里假設鍵值都是互不相等的正整數。
輸入格式:
輸入第一行給出一個正整數N(≤30),是二叉樹中結點的個數。第二行給出其后序遍歷序列。第三行給出其中序遍歷序列。數字間以空格分隔。
輸出格式:
在一行中輸出該樹的層序遍歷的序列。數字間以1個空格分隔,行首尾不得有多余空格。
輸入樣例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
輸出樣例:
4 1 6 3 5 7 2
用數組模擬二叉樹,設根結點為n,左孩子編號為2n,右孩子編號為2n+1,以這種方式存儲二叉樹 按順序輸出則為層序遍歷。下面就定義一個數組,然后不斷在子遞歸中查找根結點,將根結點存入相應的數組位置中。
 
 1 //下標從0開始
 2 //post[]為已知的后序遍歷元素,in[]為已知的中序遍歷元素
 3 //len-1為傳進的post[]的根結點下標,len為在子遞歸函數(即左右子樹)中的元素個數
 4 //p為根在num[]中的存儲位置,即左右孩子結點成為子遞歸的根
 5 //p的起始位置是1
 6 void Levelorder(int post[],int in[],int len,int p)
 7 {
 8     if(len < 1)    //當子樹沒有元素時,返回
 9     {
10         num[p] = -1;
11         return;
12     }
13     
14     int i = 0;
15     //len-1 為此次遞歸函數中 要存儲在num[]數組中的根結點下標
16     //在中序遍歷元素中,找到該根結點位置i,則左邊為左子樹,右邊為右子樹
17     while(post[len-1] != in[i])   i ++;
18     
19     num[p] = post[len-1];
20 
21     Levelorder(post,in,i,2*p);    //遍歷左子樹
22     Levelorder(post+i,in+i+1,len-i-1,2*p+1);//遍歷右子樹
23 }

 

 

補充:此處num[]數組存儲結點的元素 應該開的可能的大。雖然N<=30,但是在最壞情況下,假設所有結點均在右子樹上,則num[]中的結點下標均為 a(n)= 2*a(n-1)+1 ,經推導,下標a(n) = 2^(n-1)-1,當n=30時,最后一個元素的下標為a(30) = 2^30-1.


免責聲明!

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



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