04-樹4 是否同一棵二叉搜尋樹 (25 分)
阿新 • • 發佈:2019-01-02
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>
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;
}
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);
}
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 (i = 1;i < N;i++) {
scanf("%d",&V);
T=Insert(T,V);
}
return T;
}
int main(int argc, char *argv[]) {
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;
}