一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹:對於任一結點,
其左子樹中所有結點的鍵值小於該結點的鍵值;
其右子樹中所有結點的鍵值大於等於該結點的鍵值;
其左右子樹都是二叉搜尋樹。
所謂二叉搜尋樹的「映象」,即將所有結點的左右子樹對換位置後所得到的樹。
給定乙個整數鍵值序列,現請你編寫程式,判斷這是否是對一棵二叉搜尋樹或其映象進行前序遍歷的結果。
輸入格式:
輸入的第一行給出正整數 n(≤1000)。隨後一行給出 n 個整數鍵值,其間以空格分隔。
輸出格式:
如果輸入序列是對一棵二叉搜尋樹或其映象進行前序遍歷的結果,則首先在一行中輸出 yes ,然後在下一行輸出該樹後序遍歷的結果。數字間有 1 個空格,一行的首尾不得有多餘空格。若答案是否,則輸出 no。
輸入樣例 1:
78 6 5 7 10 8 11
輸出樣例 1:
yes5 7 6 8 11 10 8
題目鏈結
思路:假設它是二叉搜尋樹,根據二叉搜尋樹的性質將已知的前序轉換為後序,轉換過程中,如果發現最後輸出的後序陣列長度不為n,那就設ismirror為true,然後清空後序陣列,重新再轉換一次(根據鏡面二叉搜尋樹的性質),如果依舊轉換後陣列大小不等於n,就輸出no否則輸出yes
#include
typedef
long
long ll;
using
namespace std;
int n;
const
int n =
1005
;int arr[n]
;bool ismirror =
false
;vector<
int>vc;
void
getpos
(int root,
int tail)
while
(arr[r]
>=arr[root]
&&r>root)
}else
while
(arr[r]
&&r>root)}if
(l!=r+1)
return
;getpos
(root+
1, r)
;getpos
(r+1
, tail)
; vc.
push_back
(arr[root]);
}void
solve()
getpos(1
, n);if
(vc.
size()
!= n)
if(vc.
size()
== n)
else
}signed
main()
}
L2 004 這是二叉搜尋樹嗎?
時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹 對於任一結點,所謂二叉搜尋樹的 映象 即將所有結點的左右子樹對換位置後所得到的樹。給定乙個整數鍵值序列,現請你編寫程式,判斷這是否...
L2 004 這是二叉搜尋樹嗎?
一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹 對於任一結點,其左子樹中所有結點的鍵值小於該結點的鍵值 其右子樹中所有結點的鍵值大於等於該結點的鍵值 其左右子樹都是二叉搜尋樹。所謂二叉搜尋樹的 映象 即將所有結點的左右子樹對換位置後所得到的樹。給定乙個整數鍵值序列,現請你編寫程式,判斷這是否是對...
L2 004 這是二叉搜尋樹嗎?
時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹 對於任一結點,所謂二叉搜尋樹的 映象 即將所有結點的左右子樹對換位置後所得到的樹。給定乙個整數鍵值序列,現請你編寫程式,判斷這是否...