MOOC 小白专场 判断是否同一棵二叉搜索树
#include <iostream> #include <cstdio> #include <cstdlib> using namespace std; // 判断是否同一棵二叉搜索树 /* 求解思路: 1. 搜索树表示 2. 建搜索树T 3. 判别一序列是否与搜索树一致 */ // 搜索树表示 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(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->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; } } // 有bug版本 //int Judge(Tree T, int N) //{ // int i, V; // // if(V != T->v) return 0; // else T->flag = 1; // // for(i = 1; i < N; ++ i) // { // scanf("%d", &V); // if(!check(T, V)) return 0; // } // return 1; //} 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) /* 清除T中各节点的flag标记 */ { if(T->Left) ResetT(T->Left); if(T->Right) ResetT(T->Right); T->flag = 0; } void FreeTree(Tree T) /* 释放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; } /* 4 2 3 1 4 2 3 4 1 2 3 2 4 1 2 1 2 1 1 2 0 */