L2 006 樹的遍歷 (後序中序求層序)

2022-08-27 04:51:10 字數 1339 閱讀 6390

給定一棵二叉樹的後序遍歷和中序遍歷,請你輸出其層序遍歷的序列。這裡假設鍵值都是互不相等的正整數。

輸入第一行給出乙個正整數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
前序:根左右

後序:左右根

中序:左根右

依然是區間遞迴:由後序遍歷的規則可知,乙個樹的遍歷的最後一位就是該樹的根結點,所以我們只需在中序遍歷中找到該根結點即可在中序遍歷中分出左右子樹,然後左右子樹再分別進行遞迴。如果題目要求的是先序遍歷的話只需每層遍歷輸出根節點即可,但是題目要求輸出層序遍歷。我們可以建立乙個陣列level,初值全部設為-1,表示沒有結點,將每一層的根節點存入陣列的相應位置,然後按順序輸出非-1的元素就能得到層序遍歷。

題目中的二叉樹不一定是完全二叉樹,比如樣例中的二叉樹如下圖中黑色實線。**中左子樹在陣列level中儲存根節點的位置是index*2+1,右子樹是index*2+2,index其實是這兩個子樹對應的上一層的的根節點。下圖紅字代表這些結點(沒有結點就是-1)在level中存放的位置。比如題目中這個樹在level中應該是這樣儲存的:4 1 6 -1 3 5 7 -1 -1 2 -1 -1 -1 -1……,level這個陣列可以理解為代表完全二叉樹,相當於要把存在的結點往上面填。

思路來自:

#include #include 

#include

using

namespace

std;

vector

post(35),in(35),level(10000,-1

);//

後序中的最後乙個結點是根結點root,在中序中從start到end移動i找到這個根結點的位置,i以左是左子樹,以右是右子樹

void pre(int start,int end,int root,int index)//

index是根節點在陣列level中存放的位置

intmain()

for(int i=0;i)

pre(

0,n-1,n-1,0

);

int cnt=0

;

for(int i=0;i<10000;i++)

else

if(level[i]!=-1

)

} return0;

}

L2 006 樹的遍歷

時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 給定一棵二叉樹的後序遍歷和中序遍歷,請你輸出其層序遍歷的序列。這裡假設鍵值都是互不相等的正整數。輸入格式 輸入第一行給出乙個正整數n 30 是二叉樹中結點的個數。第二行給出其後序遍歷...

L2 006 樹的遍歷

時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 給定一棵二叉樹的後序遍歷和中序遍歷,請你輸出其層序遍歷的序列。這裡假設鍵值都是互不相等的正整數。輸入格式 輸入第一行給出乙個正整數n 30 是二叉樹中結點的個數。第二行給出其後序遍歷...

L2 006 樹的遍歷

給定一棵二叉樹的後序遍歷和中序遍歷,請你輸出其層序遍歷的序列。這裡假設鍵值都是互不相等的正整數。輸入第一行給出乙個正整數n 30 是二叉樹中結點的個數。第二行給出其後序遍歷序列。第三行給出其中序遍歷序列。數字間以空格分隔。在一行中輸出該樹的層序遍歷的序列。數字間以1個空格分隔,行首尾不得有多餘空格。...