-
题目描述:
-
判断两序列是否为同一二叉搜索树序列
-
输入:
-
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
-
输出:
-
如果序列相同则输出YES,否则输出NO
-
样例输入:
-
2 567432 543267 576342 0
-
样例输出:
-
YES NO
-
-
-
代码如下:
-
#include <iostream> #include <string> using namespace std; typedef char Elem; /*树结点*/ typedef struct node { struct node *lNode; struct node *rNode; Elem data; }BiNode, *BiTree; /*递归创建二叉搜索树*/ void createBST(BiTree &T, Elem c) { if (T == NULL) { T = new BiNode; T->lNode = NULL; T->rNode = NULL; T->data = c; return; } if (T->data == c) { return; } else if (T->data > c) { createBST(T->lNode, c); } else { createBST(T->rNode, c); } } /*销毁二叉树*/ void destroyBST(BiTree &T) { if (T == NULL) { return; } destroyBST(T->lNode); destroyBST(T->rNode); delete T; T = NULL; } /*先序遍历二叉树*/ void preOrderBST(BiTree &T, string &s) { if (T == NULL) { s += "#"; return; } s += T->data; preOrderBST(T->lNode, s); preOrderBST(T->rNode, s); } /*判断二叉树是否为同一科*/ bool isEqualBST(BiTree &T, BiTree &S) { if (T==NULL && S==NULL) { return true; } if (T && S && (T->data==S->data)) { return isEqualBST(T->lNode, S->lNode) && isEqualBST(T->rNode, S->rNode); } else { return false; } } int main() { BiTree T = NULL; BiTree S = NULL; string str1; string str2; string des1; string des2; int i, j; int n; while (cin>>n && n) { T = NULL;//需要置空,否则不能AC cin >> str1; for (i=0; i<str1.length(); i++) { createBST(T, str1[i]); } des1 = ""; preOrderBST(T, des1); //cout << des1 << endl; for (j=0; j<n;j++) { S = NULL;//需要置空,否则不能AC cin >> str2; for (i=0; i<str2.length(); i++) { createBST(S, str2[i]); } des2 = ""; preOrderBST(S, des2); //cout << des2 << endl; if (isEqualBST(T, S)) { cout << "YES" << endl; } else { cout << "NO" << endl; } destroyBST(S); } } destroyBST(T); return 0; }