題目:
給出一棵二叉樹的中序和後序,輸出它的先序(結點用不同的大寫字母表示,長度<=8)
先序遍歷:[根 [左子樹先序遍歷結果] [右子樹先序遍歷結果]]
中序遍歷:[[左子樹中序遍歷結果] 根 [右子樹中序遍歷結果]]
後序遍歷:[[左子樹後序遍歷結果] [右子樹後序遍歷結果] 根]
首先確定根結點:在後序遍歷中,最後乙個是根結點,
在中序遍歷中找到根結點,建立左子樹,建立右子樹,
至於如何建立左子樹和右子樹?請重新再讀一遍這段話。
由題目知,結點互不相同,於是建立乙個對映idx,直接在中序遍歷中找到根的位置(當然也可以直接for迴圈遍歷一遍中序遍歷 ,找到 根 的位置)
在中序遍歷中找到根的位置m後,如果m不在中序遍歷的開頭,那麼說明這個根結點是有左子樹的,如果m不在中序遍歷的末尾,說明這個根結點是有右子樹的。
#include
#include
#include
#include
#include
#include
using
namespace std;
const
int inf =
0x3f3f3f3f
;const
int maxn =
1e5+7;
string in_order, post_order;
unordered_map<
char
,int
> idx;
// [l1, r1]為中序遍歷in_order的區間, [l2, r2]為後序遍歷post_order的區間
void
print
(int l1,
int r1,
int l2,
int r2)
intmain()
複雜度 P1030 求先序排列
給出一棵二叉樹的中序與後序排列。求出它的先序排列。約定樹結點用不同的大寫字母表示,長度 8 2行,均為大寫字母組成的字串,表示一棵二叉樹的中序與後序排列。1行,表示一棵二叉樹的先序。badc bdca abcd 一棵樹的後序遍歷中的最後一位就是根結點,而中序遍歷中根結點的左右兩邊就是左右子樹上的結點...
P1030 求先序排列
給出一棵二叉樹的中序與後序排列。求出它的先序排列。約定樹結點用不同的大寫字母表示,長度 8 輸入格式 2行,均為大寫字母組成的字串,表示一棵二叉樹的中序與後序排列。輸出格式 1行,表示一棵二叉樹的先序。輸入樣例 1 複製badc bdca includeusing namespace std str...
P1030 求先序排列
給出一棵二叉樹的中序與後序排列。求出它的先序排列。約定樹結點用不同的大寫字母表示,長度 8 輸入格式 2行,均為大寫字母組成的字串,表示一棵二叉樹的中序與後序排列。輸出格式 1行,表示一棵二叉樹的先序。輸入樣例 1 複製badc bdca 輸出樣例 1 複製abcd 思路 後序遍歷的最後乙個元素必定...