給定乙個插入序列就可以唯一確定一棵二叉搜尋樹。然而,一棵給定的二叉搜尋樹卻可以由多種不同的插入序列得到。例如分別按照序列和插入初始為空的二叉搜尋樹,都得到一樣的結果。於是對於輸入的各種插入序列,你需要判斷它們是否能生成一樣的二叉搜尋樹。
輸入包含若干組測試資料。每組資料的第1行給出兩個正整數n (≤10)和l,分別是每個序列插入元素的個數和需要檢查的序列個數。第2行給出n個以空格分隔的正整數,作為初始插入序列。最後l行,每行給出n個插入的元素,屬於l個需要檢查的序列。
簡單起見,我們保證每個插入序列都是1到n的乙個排列。當讀到n為0時,標誌輸入結束,這組資料不要處理。
對每一組需要檢查的序列,如果其生成的二叉搜尋樹跟對應的初始序列生成的一樣,輸出「yes」,否則輸出「no」。
4 2
3 1 4 2
3 4 1 2
3 2 4 1
2 12 1
1 20
yes
nono
對於每乙個序列都建一棵樹,進行比較時也有兩種思路
參考:pta 7-3 樹的同構 遞迴實現
思路二:由於中序序列和前序序列(或後序序列)可以唯一確定一棵樹,故只要對兩棵樹分別遍歷,分別獲得中序序列和前序序 列,比較是否相等即可。
由於均是二叉搜尋樹,中序遍歷的序列一定都是單調遞增的數列,中序序列一定相同,不用遍歷比較。
比較兩個前序序列是否相等可借助vector。
/*思路二***/
#include#include#include#includeusing namespace std;
struct node;
//node tree[12];
int a1[12],a2[12]; //存放輸入的資料
int n,l;
vectorans1,ans2;
node* search(int x,node*root)
else if(xdata) root->lchild=search(x,root->lchild);
else root->rchild=search(x,root->rchild);
return root;
}node* build_tree(int n,int a)
int main()
int main()
;//node tree[12];
int a1[12],a2[12]; //存放輸入的資料
int n,l;
vectorans1,ans2;
/*在查詢失敗的地方插入x*/
node* search(int x,node*root)
else if(xdata) root->lchild=search(x,root->lchild);
else root->rchild=search(x,root->rchild);
return root;
}/*建樹*/
node* build_tree(int n,int a)
/*檢查每個結點是否合法*/
bool check(node*node,int x)
else //當前結點還沒訪問過
else return false; }}
bool judge(node*root,int a)
} return true;
} int main()
node*root1=build_tree(n,a1);
for(int i=0;ipre_order(root1);//對原始序列重置標記
if(judge(root1,a2))
printf("yes\n");
else printf("no\n");
} }return 0;
}
pta7 4 是否同一棵二叉搜尋樹
題目 給定乙個插入序列就可以唯一確定一棵二叉搜尋樹。然而,一棵給定的二叉搜尋樹卻可以由多種不同的插入序列得到。例如分別按照序列和插入初始為空的二叉搜尋樹,都得到一樣的結果。於是對於輸入的各種插入序列,你需要判斷它們是否能生成一樣的二叉搜尋樹。輸入格式 輸入包含若干組測試資料。每組資料的第1行給出兩個...
PTA 7 4 是否是同一棵二叉搜尋樹
總體思路 採用先序遍歷的方式來進行比較即可。靜態樹 題目描述 給定乙個插入序列就可以唯一確定一棵二叉搜尋樹。然而,一棵給定的二叉搜尋樹卻可以由多種不同的插入序列得到。例如分別按照序列和插入初始為空的二叉搜尋樹,都得到一樣的結果。於是對於輸入的各種插入序列,你需要判斷它們是否能生成一樣的二叉搜尋樹。輸...
PTA7 4 是否同一棵二叉搜尋樹 25分
給定乙個插入序列就可以唯一確定一棵二叉搜尋樹。然而,一棵給定的二叉搜尋樹卻可以由多種不同的插入序列得到。例如分別按照序列和插入初始為空的二叉搜尋樹,都得到一樣的結果。於是對於輸入的各種插入序列,你需要判斷它們是否能生成一樣的二叉搜尋樹。輸入包含若干組測試資料。每組資料的第1行給出兩個正整數n 10 ...