l2-004. 這是二叉搜尋樹嗎?
一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹:對於任一結點,
其左子樹中所有結點的鍵值小於該結點的鍵值;
其右子樹中所有結點的鍵值大於等於該結點的鍵值;
其左右子樹都是二叉搜尋樹。
所謂二叉搜尋樹的「映象」,即將所有結點的左右子樹對換位置後所得到的樹。
給定乙個整數鍵值序列,現請你編寫程式,判斷這是否是對一棵二叉搜尋樹或其映象進行前序遍歷的結果。
輸入格式:
輸入的第一行給出正整數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:
no解題思路:
使用晴神書上的解題方法,很好理解。
1.根據輸入順序,構建二叉搜尋樹。
2.用前序、映象前序、後序、映象後序,來分別遍歷這棵bst,得到遍歷序列。借用vector陣列的性質,可以比較整個陣列。
3.比較遍歷得到的陣列,按照題目要求的邏輯來判斷並輸出。
#include
#include
#include
#include
using
namespace
std;
const
int maxn=1e3+10;
struct node;
void insert(node* &root,int x)else
if(x data )else
}vector
ori,pre,mpre,post,mpost;
//先序
void preorder(node *root,vector
&vi)
//映象先序
void mpreorder(node *root,vector
&vi)
//後序
void postorder(node *root,vector
&vi)
//映象後序
void mpostorder(node *root,vector
&vi)
int main()
preorder(root,pre);
mpreorder(root,mpre);
postorder(root,post);
mpostorder(root,mpost);
if(ori==pre)
}else
if(ori==mpre)
}else
return
0;}
L2 004 這是二叉搜尋樹嗎?
時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹 對於任一結點,所謂二叉搜尋樹的 映象 即將所有結點的左右子樹對換位置後所得到的樹。給定乙個整數鍵值序列,現請你編寫程式,判斷這是否...
L2 004 這是二叉搜尋樹嗎?
一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹 對於任一結點,其左子樹中所有結點的鍵值小於該結點的鍵值 其右子樹中所有結點的鍵值大於等於該結點的鍵值 其左右子樹都是二叉搜尋樹。所謂二叉搜尋樹的 映象 即將所有結點的左右子樹對換位置後所得到的樹。給定乙個整數鍵值序列,現請你編寫程式,判斷這是否是對...
L2 004 這是二叉搜尋樹嗎?
時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹 對於任一結點,所謂二叉搜尋樹的 映象 即將所有結點的左右子樹對換位置後所得到的樹。給定乙個整數鍵值序列,現請你編寫程式,判斷這是否...