洛谷P1030(求先序排列)

2021-10-09 02:38:19 字數 1305 閱讀 8266

給出一棵二叉樹的中序與後序排列。求出它的先序排列。(約定樹結點用不同的大寫字母表示,長度≤8)。

2行,均為大寫字母組成的字串,表示一棵二叉樹的中序與後序排列。

1行,表示一棵二叉樹的先序。

這是一道二叉樹的題目,當時老師是布置過這個題目的,但是我當時是用遞迴做的,但是我當時年輕,老師問了一句如果資料量10000000個,你又怎麼處理呢,我當時提出了乙個解法,好像和二叉排序樹相關,轉眼半年過去了,原解法已經忘了,現在想的這個解法也許是新解法?

我們可以每次對中序序列的l1∼

r1

l_1 \sim r_1

l1​∼r1

​的範圍和後序序列的l2∼

r2

l_2 \sim r_2

l2​∼r2

​的範圍內搜尋,在中序序列中找到後序序列中r

2r_2

r2​位置上的節點,假設它在中序序列中對應下標為p,中序序列裂變成l1∼

(p−1

)l_1\sim (p-1)

l1​∼(p

−1)和(p+

1)∼r

1(p+1) \sim r_1

(p+1)∼

r1​兩部分,後序遍歷裂變成l2∼

(l2+

p−1−

l1

)l_2\sim (l_2+p-1-l_1)

l2​∼(l

2​+p

−1−l

1​)和(l2

+p−l

1)∼(

r2−1

)(l_2+p-l_1)\sim (r2-1)

(l2​+p

−l1​

)∼(r

2−1)

兩部分,然後繼續向下**,直到不能**為止,注意,每次**時,都要把p位置上節點的值輸出一次,因為後序序列的最後乙個節點就是先序序列的第乙個節點。這題資料量特別小,遞迴應該能過,但是我害怕10000000的資料量,所以我選擇非遞迴做法,並且用陣列模擬了棧。

talking is cheap,show you my code.

#include

#include

using

namespace std;

string str1, str2;

//str1:中序,str2:後序

int node[10]

[4];

intmain()

cout << str2[r2];if

(r1 > begin)

if(begin > l1)

}return0;

}

洛谷 P1030 求先序排列

給出一棵二叉樹的中序與後序排列。求出它的先序排列。約定樹結點用不同的大寫字母表示,長度8 8 輸入格式 2行,均為大寫字母組成的字串,表示一棵二叉樹的中序與後序排列。輸出格式 1行,表示一棵二叉樹的先序。思路 1.通過後序找根節點 2.通過根節點回中序劃分左右子樹 3.重複1,2 ps 雖然思路蠻清...

洛谷P1030求先序排列

在這裡做個小總結吧 對於樹的三種遍歷 如果給定前序遍歷和後序遍歷,中序遍歷不一定是確定的 但是給定中序與後序排列,是可以確定前序的 並且給定前序和中序也是可以確定後序的。這道題就討論第二種情況 重點就是先找到根,然後在遞迴就可以了 define crt secure no warnings incl...

洛谷 p1030 求先序排列

這個題做了快半上午 實際上只是一道普及 因為我太蒻了 我不太理解遞迴啊,我實在太蒻了,於是就開始做了這道題 一開始陣列越界,蜜汁re 吐槽結束 思路大家應該都明白吧 找後序遍歷的最後乙個,去中序遍歷找到,然後左右二分,就這麼簡單 includeusing namespace std string a...