二叉搜索树
http://codeup.cn/problem.php?cid=100000613&pid=1
前言:
最近老师的进度学习到了二叉搜索树这块,在《算法笔记》对应的Codeup上做题,做到了这个“二叉搜索树”,挺有意思的也调了0.5h,在这里就写一篇题解
题目简述:
说实话,这题题目有坑啊...请注意题面“n=0的时候输入结束”,这里说明n有多个!
对于每一组数据(一个n为一组数据):
给定一个n,输入一个基础字符串,根据这个基础字符串建立一棵二叉搜索树
然后以下n行,每行给出一个字符串,要求判断该字符串构建的二叉搜索树与基础字符串构建的二叉搜索树是否相同,相同输出“YES”,不相同输出“NO”
解题思路:
(1)要判断两棵树是否相同,只需要判断两棵树的先序和中序(后序+中序或层序+中序都可以,但是先序+中序更简单quq)是否都相同,是的话说明两棵树相同,反之一定不相同(因为根据某序+中序可以确定唯一的树)
(2)对于每一组数据(一个n为一组数据):
每输入一个基础字符串就建树一次,然后用两个string:pre和in分别存储基础字符串建树后的先序和中序
以下依次输入n个待判断字符串,也每次建树一次,然后用两个string:pres和ins分别存储待判断字符串的先序和中序,再跟基础字符串的pre和in作比较,满足条件就输出“YES”,反之输出“NO”
(3)注意:因为变量是循环利用,所以每一次使用之后都要清零(初始化)
代码Code:
给出用数组实现的二叉搜索树qwq
#include <bits/stdc++.h>
using namespace std;
int n;
char a[10001],tree[10001]; //a是字符串,tree循环建树
string pre,in,pres,ins;
/*pre和in存储基础字符串的先序和中序;pres和ins存储待判断字符串的先序和中序 */
inline void insert(int i,char x) { //边读入边建树
if(tree[i]=='@') {
tree[i]=x;
return ;
}
if(x>tree[i]) insert(2*i+1,x);
else insert(2*i,x);
}
inline void preorder(int i) { //基础字符串的先序
if(tree[i]=='@') return ;
pre+=tree[i];
preorder(2*i);
preorder(2*i+1);
}
inline void inorder(int i) { //基础字符串的中序
if(tree[i]=='@') return ;
inorder(2*i);
in+=tree[i];
inorder(2*i+1);
}
inline void preorders(int i) { //待判断字符串的先序
if(tree[i]=='@') return ;
pres+=tree[i];
preorders(2*i);
preorders(2*i+1);
}
inline void inorders(int i) { //待判断字符串的中序
if(tree[i]=='@') return ;
inorders(2*i);
ins+=tree[i];
inorders(2*i+1);
}
int main() {
while(scanf("%d",&n)) {
if(n==0) break;
cin>>a;
fill(tree+1,tree+1+10001,'@'); //初始化
pre=""; //清空
in="";
for(register int i=0;i<strlen(a);i++) insert(1,a[i]); //建树
preorder(1);
inorder(1);
// cout<<pre<<endl<<in<<endl;
for(register int i=1;i<=n;i++) {
fill(tree+1,tree+1+10001,'@'); //初始化
cin>>a;
for(register int j=0;j<strlen(a);j++) insert(1,a[j]);
preorders(1);
inorders(1);
// cout<<pres<<" "<<ins<<endl;
if(pres==pre&&ins==in) puts("YES");
else puts("NO");
pres=""; //清空
ins="";
}
}
return 0;
}
特别鸣谢:RHL大佬给予本蒟数组实现二叉搜索树的指导