一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹:對於任一結點,
1.其左子樹中所有結點的鍵值小於該結點的鍵值;
2.其右子樹中所有結點的鍵值大於等於該結點的鍵值;
3.其左右子樹都是二叉搜尋樹。
所謂二叉搜尋樹的「映象」,即將所有結點的左右子樹對換位置後所得到的樹。
給定乙個整數鍵值序列,現請你編寫程式,判斷這是否是對一棵二叉搜尋樹或其映象進行前序遍歷的結果。
輸入格式:
輸入的第一行給出正整數 n(≤1000)。隨後一行給出 n 個整數鍵值,其間以空格分隔。
輸出格式:
如果輸入序列是對一棵二叉搜尋樹或其映象進行前序遍歷的結果,則首先在一行中輸出 yes ,然後在下一行輸出該樹後序遍歷的結果。數字間有 1 個空格,一行的首尾不得有多餘空格。若答案是否,則輸出 no。
輸入樣例 1:
78 6 5 7 10 8 11
輸出樣例 1:
yes5 7 6 8 11 10 8
輸入樣例 2:
78 10 11 8 6 7 5
輸出樣例 2:
yes11 8 10 7 5 6 8
輸入樣例 3:
78 6 8 5 10 9 11
輸出樣例 3:
no
#include
#include
using
namespace std;
typedef
struct node
bstnode;
intinsertbst
(bstnode *
&p,int k)
else
if(k==p-
>data||k>p-
>data)
return
insertbst
(p->rchild,k)
;else
return
insertbst
(p->lchild,k);}
bstnode *
creatbst
(int a,
int n)
return bt;
}int m=
0,c[
1000];
void
preorder1
(bstnode *bt)
//這棵樹前序遍歷的結果儲存在c中
}int t=
0,d[
1000];
void
preorder2
(bstnode *bt)
}void
swap
(bstnode *b,bstnode *
&t)}
int p=0;
void
postorder1
(bstnode *b)
}int q=0;
void
postorder2
(bstnode *b)
}boolf(
int a,
int b,
int n)
intmain()
swap
(bt,t)
;//若不相同,判斷是否是其映象進行前序遍歷的結果
preorder2
(t);if(
f(a,d,n)
&&flag!=1)
//判斷與輸入是否相同,若相同,則是其映象進行前序遍歷的結果
if(flag==1)
postorder1
(bt)
;else
if(flag==2)
postorder2
(t);
else cout<<
"no"
;//輸入序列不是對一棵二叉搜尋樹或其映象進行前序遍歷的結果
return0;
}
L2 004 這是二叉搜尋樹嗎?
時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹 對於任一結點,所謂二叉搜尋樹的 映象 即將所有結點的左右子樹對換位置後所得到的樹。給定乙個整數鍵值序列,現請你編寫程式,判斷這是否...
L2 004 這是二叉搜尋樹嗎?
一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹 對於任一結點,其左子樹中所有結點的鍵值小於該結點的鍵值 其右子樹中所有結點的鍵值大於等於該結點的鍵值 其左右子樹都是二叉搜尋樹。所謂二叉搜尋樹的 映象 即將所有結點的左右子樹對換位置後所得到的樹。給定乙個整數鍵值序列,現請你編寫程式,判斷這是否是對...
L2 004 這是二叉搜尋樹嗎?
時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹 對於任一結點,所謂二叉搜尋樹的 映象 即將所有結點的左右子樹對換位置後所得到的樹。給定乙個整數鍵值序列,現請你編寫程式,判斷這是否...