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個人的個人資產值,以百萬元為單位,為不超...