版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42449444/article/details/86163191
判断两序列是否为同一二叉搜索树序列
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。 接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。 接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
如果序列相同则输出YES,否则输出NO。
2
567432
543267
576342
0
YES
NO
利用队列来层次遍历二叉树求解。
#include <bits/stdc++.h>
using namespace std;
typedef struct TreeNode
{
int data;
TreeNode *lchild,*rchild;
}*Tree;
//利用队列来实现二叉树的层次遍历
void LevelOrder(Tree root,vector<int> &v)
{
v.clear(); //一定先清空容器
queue<Tree> q;
q.push(root);
while(!q.empty()) //队列非空时
{
Tree bt = q.front();
q.pop();
v.push_back(bt->data);
//将队首结点的左孩子结点入队列
if(bt->lchild != NULL)
{
q.push(bt->lchild);
}
//将队首结点的右孩子结点入队列
if(bt->rchild != NULL)
{
q.push(bt->rchild);
}
}
}
void Insert(Tree &root,int x)
{
if(root == NULL)
{
root = new TreeNode;
root->data = x;
root->lchild = root->rchild = NULL;
}
else if(x < root->data)
{
Insert(root->lchild,x);
}
else
{
Insert(root->rchild,x);
}
}
Tree Str2Tree(string s) //根据字符串得到一棵树
{
Tree bt = NULL;
for (int i = 0; i < s.length(); ++i)
{
Insert(bt,s[i]);
}
return bt;
}
int main()
{
int n;
string str,temp;
vector<int> a,b;
while(cin >> n && n)
{
cin >> str;
Tree bt = Str2Tree(str);
LevelOrder(bt,a);
for (int i = 0; i < n; ++i)
{
cin >> temp;
Tree temp_bt = Str2Tree(temp);
LevelOrder(temp_bt,b);
if(a == b)
{
cout << "YES" << endl;
}
else
{
cout << "NO" << endl;
}
}
}
return 0;
}