對於二叉搜尋樹,我們規定任一結點的左子樹僅包含嚴格小於該結點的鍵值,而其右子樹包含大於或等於該結點的鍵值。如果我們交換每個節點的左子樹和右子樹,得到的樹叫做映象二叉搜尋樹。
現在我們給出乙個整數鍵值序列,請編寫程式判斷該序列是否為某棵二叉搜尋樹或某映象二叉搜尋樹的前序遍歷序列,如果是,則輸出對應二叉樹的後序遍歷序列。
輸入格式:
輸入的第一行包含乙個正整數n(≤1000),第二行包含n個整數,為給出的整數鍵值序列,數字間以空格分隔。
輸出格式:
輸出的第一行首先給出判斷結果,如果輸入的序列是某棵二叉搜尋樹或某映象二叉搜尋樹的前序遍歷序列,則輸出yes,否側輸出no。如果判斷結果是yes,下一行輸出對應二叉樹的後序遍歷序列。數字間以空格分隔,但行尾不能有多餘的空格。
輸入樣例1:
786
57108
11
輸出樣例1:
yes57
681110
8
輸入樣例2:
786
85109
11
輸出樣例2:
no
程式如下:
#include
#include
using
namespace std;
typedef
struct node* bintree;
struct node
;int a[
1001
], b[
1001
], c[
1001];
//a為輸入序列,b為按此序列建樹後的前序遍歷序列,c為對應映象前序遍歷序列
int n, b=
0, c=
0,n=0;
//b為b中的下標,c為c中的下標
bintree insert
(bintree bt,
int x)
//像二叉搜尋樹中插入元素
else
if(x < bt-
>data)
bt->left =
insert
(bt-
>left, x)
;//x小於當前節點資料則插入左子樹
else
bt->right =
insert
(bt-
>right, x)
;//否則插入右子樹
return bt;
}void
pretree
(bintree bt)
//前序遍歷並記錄前序序列
}void
mpretree
(bintree bt)
//映象前序遍歷並記錄前序序列
}void
lasttree
(bintree bt)
//後序遍歷並輸出後序序列
}void
mlasttree
(bintree bt)
//映象後序遍歷並輸出後序序列
}int
main()
pretree
(bt)
;//得到此二叉搜尋樹前序遍歷序列
mpretree
(bt)
;//得到對應的映象前序序列
int flagp=
1, flagm=1;
//標記初始序列與前序或映象前序序列是否一致
for(
int i=
0;i)//逐一比對
if(a[i]
!=b[i]
)for
(int i=
0;i)//同上
if(a[i]
!=c[i])if
(flagp==
0&& flagm==0)
cout <<
"no"
<< endl;
//如果均不同則輸出no
else
//最後if(ismir)必須排除ispre同為1的情況,否則最小n時會輸出兩個序列
return0;
}
7 10 搜尋樹判斷 (25 分
對於二叉搜尋樹,我們規定任一結點的左子樹僅包含嚴格小於該結點的鍵值,而其右子樹包含大於或等於該結點的鍵值。如果我們交換每個節點的左子樹和右子樹,得到的樹叫做映象二叉搜尋樹。現在我們給出乙個整數鍵值序列,請編寫程式判斷該序列是否為某棵二叉搜尋樹或某映象二叉搜尋樹的前序遍歷序列,如果是,則輸出對應二叉樹...
7 28 搜尋樹判斷 25分
對於二叉搜尋樹,我們規定任一結點的左子樹僅包含嚴格小於該結點的鍵值,而其右子樹包含大於或等於該結點的鍵值。如果我們交換每個節點的左子樹和右子樹,得到的樹叫做映象二叉搜尋樹。現在我們給出乙個整數鍵值序列,請編寫程式判斷該序列是否為某棵二叉搜尋樹或某映象二叉搜尋樹的前序遍歷序列,如果是,則輸出對應二叉樹...
5 4 搜尋樹判斷 25分
5 4 搜尋樹判斷 25分 對於二叉搜尋樹,我們規定任一結點的左子樹僅包含嚴格小於該結點的鍵值,而其右子樹包含大於或等於該結點的鍵值。如果我們交換每個節點的左子樹和右子樹,得到的樹叫做映象二叉搜尋樹。現在我們給出乙個整數鍵值序列,請編寫程式判斷該序列是否為某棵二叉搜尋樹或某映象二叉搜尋樹的前序遍歷序...