給定一棵二叉樹的后序遍歷和中序遍歷,請你輸出其層序遍歷的序列。這里假設鍵值都是互不相等的正整數。輸入格式:
輸入第一行給出一個正整數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.
