P1030 求先序排列

2021-10-23 07:47:49 字數 1052 閱讀 4872

題目:

給出一棵二叉樹的中序和後序,輸出它的先序(結點用不同的大寫字母表示,長度<=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 思路 後序遍歷的最後乙個元素必定...