判断两个二叉树是否相同
给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{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
1 #include <iostream> 2 using namespace std; 3 4 struct treeNode{//抽象数据类型 5 int v; 6 treeNode* left, *right; 7 bool flag; 8 treeNode(int v, treeNode* left, treeNode* right, bool flag){//构造函数 9 this->v = v; 10 this->left = left; 11 this->right = right; 12 this->flag = flag; 13 } 14 }; 15 16 treeNode* insert(treeNode* T, int V){ 17 if(!T) T = new treeNode(V, NULL, NULL, false); //插入每个结点,当t为空时是fasle 18 else { 19 if(V > T->v) 20 T->right = insert(T->right, V); 21 else 22 T->left = insert(T->left, V); 23 } 24 25 return T; 26 } 27 treeNode* BuildTree(int N){ 28 int V; 29 treeNode* T; 30 31 cin >> V; 32 T = new treeNode(V, NULL, NULL, false);//新增结点,并调用构造函数 33 for(int i = 1; i < N; i++){ 34 cin >> V; 35 T = insert(T,V); 36 } 37 return T; 38 } 39 int check(treeNode* T, int V){ //按顺序查找结点,如果经过的结点之前未经过,说明不是同一颗二叉树 40 if(T->flag){ //(因为结点本该插在这个未经过的结点的位置,但现在却经过了它) 41 if(V > T->v) check(T->right, V); 42 else if(V < T->v) check(T->left, V); 43 else return 0; 44 } 45 else { 46 if(V == T->v) { 47 T->flag = 1; 48 return 1; 49 } 50 else return 0; 51 } 52 } 53 int judge(treeNode* T, int N){ 54 int V; 55 bool flag = false; 56 cin >> V; 57 if(T->v != V) flag = true; //根结点不同,树不同 58 else T->flag = true; 59 for(int i = 1; i < N; i++){ 60 cin >> V; 61 if(!flag && !check(T, V)) flag = true; //即使已经得到判断,也要把剩下的结点接收完,防止影响下一组数据 62 } 63 if(flag) return false; 64 else return true; 65 } 66 void reset(treeNode* T){ 67 if(T->left) reset(T->left); 68 if(T->right) reset(T->right); 69 T->flag = 0; 70 } 71 void freeTree(treeNode* T){ 72 if(T->left) freeTree(T->left); 73 if(T->right) freeTree(T->right); 74 free(T); 75 } 76 int main(){ 77 int N, L; 78 treeNode* T; 79 cin >> N; 80 while(N){ 81 cin >> L; 82 T = BuildTree(N); 83 for(int i = 0; i < L; i++){ 84 if(judge(T, N)) puts("Yes"); 85 else puts("No"); 86 reset(T); 87 } 88 freeTree(T); 89 cin >> N; //接收下一组 90 } 91 92 return 0; 93 }
追求吾之所爱