時間限制
400 ms
記憶體限制
65536 kb
**長度限制
8000 b
判題程式
standard
作者
陳越
一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹:對於任一結點,
所謂二叉搜尋樹的「映象」,即將所有結點的左右子樹對換位置後所得到的樹。
給定乙個整數鍵值序列,現請你編寫程式,判斷這是否是對一棵二叉搜尋樹或其映象進行前序遍歷的結果。
輸入格式:
輸入的第一行給出正整數n(<=1000)。隨後一行給出n個整數鍵值,其間以空格分隔。
輸出格式:
如果輸入序列是對一棵二叉搜尋樹或其映象進行前序遍歷的結果,則首先在一行中輸出「yes」,然後在下一行輸出該樹後序遍歷的結果。數字間有1個空格,一行的首尾不得有多餘空格。若答案是否,則輸出「no」。
輸入樣例1:
7輸出樣例1:8 6 5 7 10 8 11
yes輸入樣例2:5 7 6 8 11 10 8
7輸出樣例2:8 10 11 8 6 7 5
yes輸入樣例3:11 8 10 7 5 6 8
7輸出樣例3:8 6 8 5 10 9 11
no
解題思路: 利用遞迴去遍歷是否符合條件。。。
**如下:
#include#include#include#include#include#include#include#include#include#define ll long long
#define inf 0x3f3f3f3f
const int maxn=100001;
using namespace std;
int a[maxn],t;
bool f(int l,int r,int k)///遍歷
for(int j=i-1; j>l; j--)///右子樹
}if(q&&p) break;
}if(p&&q)
return f(l+1,i-1,k)&&f(i,r,k);///進一步遍歷左右子樹
else return false;
}void shuchu(int l,int r,int k)
int s=a[l],i;
bool p,q;
for(i=l+1; i<=r+1; i++)
for(int j=i-1; j>l; j--)///右子樹
if(k?s<=a[j]:s>a[j])
if(q&&p) break;
}shuchu(l+1,i-1,k);
shuchu(i,r,k);
printf(++t==1 ? "%d" :" %d",s);
}int main()
{ int n;
scanf("%d",&n);
for(int i=0; i
L2 004 這是二叉搜尋樹嗎?
一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹 對於任一結點,其左子樹中所有結點的鍵值小於該結點的鍵值 其右子樹中所有結點的鍵值大於等於該結點的鍵值 其左右子樹都是二叉搜尋樹。所謂二叉搜尋樹的 映象 即將所有結點的左右子樹對換位置後所得到的樹。給定乙個整數鍵值序列,現請你編寫程式,判斷這是否是對...
L2 004 這是二叉搜尋樹嗎?
時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹 對於任一結點,所謂二叉搜尋樹的 映象 即將所有結點的左右子樹對換位置後所得到的樹。給定乙個整數鍵值序列,現請你編寫程式,判斷這是否...
L2 004 這是二叉搜尋樹嗎?
題目鏈結 題解 這道題目我能想到兩種做法,方法1 直接根據樹的前序遍歷來建樹 分兩種情況 在建樹的過程中,判斷是否滿足二叉搜尋樹的條件,如果不滿足設定標誌位。然後建樹完成以後,對樹進行dfs後序遍歷,這種方法很暴力,也很容易理解,但是 有點繁瑣。方法2 直接在前序遍歷的結果上進行dfs,分成兩個子樹...