1. 程式人生 > 其它 >04-樹4 是否同一棵二叉搜尋樹

04-樹4 是否同一棵二叉搜尋樹

技術標籤:資料結構

給定一個插入序列就可以唯一確定一棵二叉搜尋樹。然而,一棵給定的二叉搜尋樹卻可以由多種不同的插入序列得到。例如分別按照序列{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<stdio.h>
#include<stdlib.h>
struct TreeNode
{
	int data;
	struct TreeNode* left;
	struct TreeNode* right;
	int flag;
};
typedef struct TreeNode* Tree;
Tree Insert
(Tree T, int x) { if (T == NULL) { T = (Tree)malloc(sizeof(struct TreeNode)); T->left = T->right = NULL; T->data = x; T->flag = 0; } else { if (x > T->data) T->right = Insert(T->right, x); else if (x < T->data) T->left = Insert(T->left, x); }
return T; } Tree Make(Tree T,int n) { int x; for (int i = 0; i < n; i++) { scanf("%d", &x); T=Insert(T, x); } return T; } //根結點必須第一個輸入 int Check(Tree T, int x) { //T已經被訪問過 if (T->flag) { if (x > T->data) return Check(T->right, x); else if (x < T->data) return Check(T->left, x); //T被訪問過而檢測值等於T->data 則出錯 else return 0; } else //T沒有被訪問過,這個位置就該是插入值,如果不是,則錯誤 { if (x == T->data) { T->flag = 1; return 1; } else return 0; } } int Judge(Tree T, int n) { int i,x,flag=0; for (i = 0; i < n; i++) { scanf("%d", &x); //flag==0&&檢查錯誤就改flag=1 if(flag == 0&&Check(T,x)==0) 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 n, i, num, x; Tree T = NULL; scanf("%d", &n); while (n) { scanf("%d", &num); T=NULL; T=Make(T,n); for (i = 0; i < num; i++) { if(Judge(T,n)) printf("Yes\n"); else printf("No\n"); Reset(T); } FreeTree(T); scanf("%d", &n); } }