PTA 7 3樹的遍歷

2021-09-11 06:30:41 字數 1505 閱讀 7810

7-3 樹的遍歷 (25 分)

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

輸入格式:

輸入第一行給出乙個正整數n(≤30),是二叉樹中結點的個數。第二行給出其後序遍歷序列。第三行給出其中序遍歷序列。數字間以空格分隔。

輸出格式:

在一行中輸出該樹的層序遍歷的序列。數字間以1個空格分隔,行首尾不得有多餘空格。

輸入樣例:

72 3 1 5 7 6 4

1 2 3 4 5 6 7

輸出樣例:

4 1 6 3 5 7 2

假設樹的根節點編號為n,則左孩子編號為2n,右孩子編號為2n+1,如果知道這個的話,就很好寫了。

我們可以把一棵樹按照這個層次的編號寫入乙個陣列裡面,節點的編號就是它的下標。

本來想著還要做個bfs呢,但是實際上這個編號本身就是層次的序列,不需要。

dfs邊界就是,空節點就寫-1,不輸出。

後序序列的最後乙個就是根節點,用它找到中序裡的根位置,中序的左邊就是它的左子樹,中序的右邊就是右子樹。

num[p]=root,我們把根節點寫入之後,再搜尋它的左子樹,然後搜尋右子樹,左子樹把左子樹的根寫入陣列,右子樹把右子樹的根寫入陣列,實際上這就完成dfs了。

自己手演,模擬一下,資料量不大。

#include

#include

const

int maxn =

100000

;int num[maxn]

,in[35]

,post[35]

;int cnt =0;

void

preorder

(int

*post,

int*in,

int len,

int p)

int i =0;

while

(post[len-1]

!=in[i]

) i++

; num[p]

= post[len-1]

;preorder

(post, in, i,

2* p)

;preorder

(post + i, in + i +

1, len -

1- i,

2* p +1)

;}intmain()

for(

int i =

0; i < n;i++

)scanf

("%d"

,&in[i]);

preorder

(post, in, n,1)

;int i;

for(i =

0; i < maxn;i++)if

(cnt==n-1)

break;}

for(i = i +

1; i < maxn;i++)}

return0;

}

PTA 7 3 樹的同構

題目描述 給定兩棵樹t1和t2。如果t1可以通過若干次左右孩子互換就變成t2,則我們稱兩棵樹是 同構 的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點a b g的左右孩子互換後,就得到另外一棵樹。而圖2就不是同構的。現在給定兩棵樹,請你判斷是否是同構的。很慚愧,這個題目做的很複雜,但是...

PTA 7 3 樹的同構 遞迴實現

給定兩棵樹t1和t2。如果t1可以通過若干次左右孩子互換就變成t2,則我們稱兩棵樹是 同構 的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點a b g的左右孩子互換後,就得到另外一棵樹。而圖2就不是同構的。圖1 圖2現給定兩棵樹,請你判斷它們是否是同構的。輸入給出2棵二叉樹樹的資訊。對...

PTA 7 3 尋找大富翁

胡潤研究院的調查顯示,截至2017年底,中國個人資產超過1億元的高淨值人群達15萬人。假設給出n個人的個人資產值,請快速找出資產排前m位的大富翁。輸入格式 輸入首先給出兩個正整數n 10 6 和m 10 其中n為總人數,m為需要找出的大富翁數 接下來一行給出n個人的個人資產值,以百萬元為單位,為不超...