04-樹4 是否同一棵二叉搜尋樹
阿新 • • 發佈:2020-12-09
技術標籤:資料結構
給定一個插入序列就可以唯一確定一棵二叉搜尋樹。然而,一棵給定的二叉搜尋樹卻可以由多種不同的插入序列得到。例如分別按照序列{2, 1, 3}和{2, 3, 1}插入初始為空的二叉搜尋樹,都得到一樣的結果。於是對於輸入的各種插入序列,你需要判斷它們是否能生成一樣的二叉搜尋樹。
輸入格式:
輸入包含若干組測試資料。每組資料的第1行給出兩個正整數N (≤10)和L,分別是每個序列插入元素的個數和需要檢查的序列個數。第2行給出N個以空格分隔的正整數,作為初始插入序列。最後L行,每行給出N個插入的元素,屬於L個需要檢查的序列。
簡單起見,我們保證每個插入序列都是1到N的一個排列。當讀到N為0時,標誌輸入結束,這組資料不要處理。
輸入樣例:
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);
}
}