給定一個插入序列就可以唯一確定一棵二叉搜索樹。然而,一棵給定的二叉搜索樹卻可以由多種不同的插入序列得到。例如分別按照序列{2, 1, 3}和{2, 3, 1}插入初始為空的二叉搜索樹,都得到一樣的結果。于是對于輸入的各種插入序列,你需要判斷它們是否能生成一樣的二叉搜索樹。
輸入格式:
輸入包含若干組測試數據。每組數據的第1行給出兩個正整數N?(≤)和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 1
2 1
1 2
0
輸出樣例:
Yes
No
No
#include<cstdio> #include<cstdlib> typedef struct TreeNode* Tree; struct TreeNode{int v;Tree left,right;int flag; };Tree NewNode(int v){Tree T = (Tree)malloc(sizeof(struct TreeNode));T->v = v;T->left = T->right = NULL;T->flag = 0;return T; }Tree Insert(Tree T,int v){if(!T) T = NewNode(v);else{if(v > T->v) T->right = Insert(T->right,v);else T->left = Insert(T->left,v);}return T; }Tree MakeTree(int n){Tree T;int i,v;scanf("%d",&v);T = NewNode(v);for(int i = 1; i < n; i++){scanf("%d",&v);T = Insert(T,v);}return T; }int check(Tree T,int v){if(T->flag){if(v > T->v) return check(T->right,v);else if(v < T->v) return check(T->left,v);else return 0;}else{if(v==T->v){T->flag = 1;return 1;}else return 0;} }int Judge(Tree T,int n){int i,v,flag = 0;scanf("%d",&v);if(v != T->v) flag = 1;else T->flag = 1;for(i = 1; i < n; i++){scanf("%d",&v);if((!flag)&&(!check(T,v))) flag = 1;}if(flag) return 0;else return 1; }void Reset(Tree T){if(T->left) Reset(T->left);if(T->right) Reset(T->right);T->flag = 0; }void FreeTree(Tree T){if(T->left) FreeTree(T->left);if(T->right) FreeTree(T->right);free(T); }int main(){int i,n,l;Tree T;scanf("%d",&n);while(n){scanf("%d",&l);T = MakeTree(n);for(i = 0; i < l; i++){if(Judge(T,n)) printf("Yes\n");else printf("No\n");Reset(T);}FreeTree(T);scanf("%d",&n);}return 0; }
?