04-樹4 是否同一棵二叉搜尋樹 (25 分)
阿新 • • 發佈:2018-11-09
04-樹4 是否同一棵二叉搜尋樹 (25 分)
給定一個插入序列就可以唯一確定一棵二叉搜尋樹。然而,一棵給定的二叉搜尋樹卻可以由多種不同的插入序列得到。例如分別按照序列{2, 1, 3}和{2, 3, 1}插入初始為空的二叉搜尋樹,都得到一樣的結果。於是對於輸入的各種插入序列,你需要判斷它們是否能生成一樣的二叉搜尋樹。
輸入格式:
輸入包含若干組測試資料。每組資料的第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 1
2 1
1 2
0
輸出樣例:
Yes
No
No
鳴謝青島大學周強老師補充測試資料!
原始碼:
#include<iostream> #include<cstdio> #include<cstdlib> #include<queue> #define Max 10 using namespace std; typedef struct TreeNode *Tree; struct TreeNode{ int v; Tree Left,Right; int flag; }; Tree MakeTree(int N); Tree NewNode(int V); Tree Insert(Tree T,int V); int check(Tree T,int V); int Judge(Tree T,int V); Tree MakeTree(int N){ Tree T; int i,V; scanf("%d",&V);//輸入根節點 T = NewNode(V); for(i=1;i<N;i++){ scanf("%d",&V); T = Insert(T,V); } return T; } 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; } int check(Tree T,int V){ if(T->flag){ if(V<T->v) return check(T->Left,V); else if(V>T->v) return check(T->Right,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;//flag:0代表一致,1代表不一致 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 ResetT(Tree T){ if(T->Left) ResetT(T->Left); if(T->Right) ResetT(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 N,L,i; 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"); ResetT(T);///清除T的標記flag } FreeTree(T); scanf("%d",&N); } return 0; }