l2-4. 這是二叉搜尋樹嗎?
時間限制
400 ms
記憶體限制
65536 kb
**長度限制
8000 b
判題程式
standard
作者 陳越
一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹:對於任一結點,
其左子樹中所有結點的鍵值小於該結點的鍵值;
其右子樹中所有結點的鍵值大於等於該結點的鍵值;
其左右子樹都是二叉搜尋樹。
所謂二叉搜尋樹的「映象」,即將所有結點的左右子樹對換位置後所得到的樹。
給定乙個整數鍵值序列,現請你編寫程式,判斷這是否是對一棵二叉搜尋樹或其映象進行前序遍歷的結果。
輸入格式:
輸入的第一行給出正整數n(<=1000)。隨後一行給出n個整數鍵值,其間以空格分隔。
輸出格式:
如果輸入序列是對一棵二叉搜尋樹或其映象進行前序遍歷的結果,則首先在一行中輸出「yes」,然後在下一行輸出該樹後序遍歷的結果。數字間有1個空格,一行的首尾不得有多餘空格。若答案是否,則輸出「no」。
輸入樣例1:
7 8 6 5 7 10 8 11
輸出樣例1:
yes
5 7 6 8 11 10 8
輸入樣例2:
7 8 10 11 8 6 7 5
輸出樣例2:
yes
11 8 10 7 5 6 8
輸入樣例3:
7 8 6 8 5 10 9 11
輸出樣例3:
noac**:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
typedef
long
long ll;
using
namespace
std;
const
int maxn = 1000;
int tree[maxn + 10], n, cnt;
//區間遞迴
//根據tab的情況測試[l + 1, r]區間上是否能夠滿足乙個位置i
//對於原樹(映象其實就是左右顛倒類推)使得[l + 1, i)上的值全小於root,[i, r]上的值全大於root
//如果每個子區間遞迴下去都滿足的話就返回true,有乙個不滿足的就返回false
bool test(int l, int r, int tab)
}for (int j = i - 1; j > l; j--)
}if (fr && fl)
}if (fr && fl)
else
}void pr(int l, int r, int tab)
int root = tree[l], i;
bool fl, fr;
for (i = l + 1; i <= r + 1; i++)
}for (int j = i - 1; j > l; j--)
}if (fr && fl)
}pr(l + 1, i - 1, tab);
pr(i, r, tab);
printf(++cnt == 1 ? "%d" : " %d", root);
}int main()
cnt = 0;
if (test(0, n - 1, 1))
else
if (test(0, n - 1, 0))
else
return
0;}
pta l2 4(這是二叉搜尋樹嗎?)
題意 給定n以及n個整數,問該序列是否為二叉搜尋樹的前序遍歷或者二叉搜尋樹映象的前序遍歷,若是,則輸出yes,並輸出其後序遍歷,否則輸出no。思路 先判斷是否為二叉搜尋樹的前序遍歷,令is false,通過遞迴和二叉搜尋樹的性質計算其後序遍歷序列,若序列長度等於n,即成立,否則令is true,再次...
L2 004 這是二叉搜尋樹嗎?
時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹 對於任一結點,所謂二叉搜尋樹的 映象 即將所有結點的左右子樹對換位置後所得到的樹。給定乙個整數鍵值序列,現請你編寫程式,判斷這是否...
L2 004 這是二叉搜尋樹嗎?
一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹 對於任一結點,其左子樹中所有結點的鍵值小於該結點的鍵值 其右子樹中所有結點的鍵值大於等於該結點的鍵值 其左右子樹都是二叉搜尋樹。所謂二叉搜尋樹的 映象 即將所有結點的左右子樹對換位置後所得到的樹。給定乙個整數鍵值序列,現請你編寫程式,判斷這是否是對...