題目:
一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹:對於任一結點,
所謂二叉搜尋樹的「映象」,即將所有結點的左右子樹對換位置後所得到的樹。
給定乙個整數鍵值序列,現請你編寫程式,判斷這是否是對一棵二叉搜尋樹或其映象進行前序遍歷的結果。
輸入格式:
輸入的第一行給出正整數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#includeusing namespace std;
const int max=1000+10;
int order[max];
int n;
int cnt;
bool judge1(int l,int r)
} fr=1;
for(int j=i+1;j<=r;j++)
}if(fl&&fr)
break;
} if(fl&&fr)
return judge2(l+1,i)&&judge2(i+1,r);
else
return false;
}void getpost1(int l,int r)
} fr=1;
for(int j=i+1;j<=r;j++)
}if(fl&&fr)
break;
} //printf("%d %d %d %d\n",l+1,mid-1,mid,r);
getpost2(l+1,i);
getpost2(i+1,r);
printf(++cnt==1?"%d":" %d",root);
}int main()
{ //freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(scanf("%d",&n)!=eof)
{ for(int i=0;i
PAT L2 004 這是二叉搜尋樹嗎?
時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹 對於任一結點,所謂二叉搜尋樹的 映象 即將所有結點的左右子樹對換位置後所得到的樹。給定乙個整數鍵值序列,現請你編寫程式,判斷這是否...
pat L2 004 這是二叉搜尋樹嗎?
一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹 對於任一結點,所謂二叉搜尋樹的 映象 即將所有結點的左右子樹對換位置後所得到的樹。給定乙個整數鍵值序列,現請你編寫程式,判斷這是否是對一棵二叉搜尋樹或其映象進行前序遍歷的結果。輸入格式 輸入的第一行給出正整數n 1000 隨後一行給出n個整數鍵值,...
L2 004 這是二叉搜尋樹嗎?
時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹 對於任一結點,所謂二叉搜尋樹的 映象 即將所有結點的左右子樹對換位置後所得到的樹。給定乙個整數鍵值序列,現請你編寫程式,判斷這是否...