判断两序列是否为同一二叉搜索树序列
耻辱题啊。
建树时一定要传引用!
建树时一定要传引用!
建树时一定要传引用!
若两个树的前序遍历和中序遍历都相同,则他们是同一棵树。
给出两个方法:
#include <bits/stdc++.h>
using namespace std;
string s1,s2,str;
string str1,str2;
typedef struct node
{
struct node *lchild;
struct node *rchild;
char data;
} BiTreeNode,*BiTree;
void buildTree(BiTree &root,char c)
{
if(root == NULL)
{
root = (BiTree) malloc(sizeof (BiTreeNode));
root->data = c;
root->lchild = NULL;
root->rchild = NULL;
}
else
{
if(root->data > c)
{
buildTree(root->lchild,c);
}
else
{
buildTree(root->rchild,c);
}
}
}
void previs(BiTree t)
{
if(t)
{
s1= s1 + t->data;
previs(t->lchild);
previs(t->rchild);
}
}
void invis(BiTree t)
{
if(t)
{
invis(t->lchild);
s2 = s2 + t->data;
invis(t->rchild);
}
}
int main()
{
int n;
BiTree root;
while(cin>>n && n)
{
root = NULL;
cin>>str;
for(int i = 0 ; i < str.size(); i++)
{
buildTree(root,str[i]);
}
s1 = "";
previs(root);
str1 = s1;
s2 = "";
invis(root);
str2 = s2;
for(int i = 0; i < n; i++)
{
BiTree r = NULL;
cin>>str;
for(int j = 0; j < str.size();j++)
{
buildTree(r,str[j]);
}
s1 = "";
s2 = "";
previs(r);
invis(r);
if(s1 != str1 || s2 != str2)
{
cout<<"NO"<<endl;
}
else
{
cout<<"YES"<<endl;
}
}
}
}
数组模拟:
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 2000;
int a[maxn],b[maxn];
void bulidtree(string str,int ar[])
{
int len = str.size();
for(int i=0; i<len; i++)
{
int num = str[i]-'0';
int j = 1;
while(j < maxn)
{
if(ar[j]==-1)
{
ar[j]=num;
break;
}
else if(ar[j] > num)
j = j * 2;
else
j = j * 2 + 1;
}
}
}
int main()
{
int n;
string s1,s2;
while(cin>>n&&n)
{
cin>>s1;
memset(a,-1,sizeof(a));
bulidtree(s1,a);
for(int i=0; i<n; i++)
{
cin>>s2;
memset(b,-1,sizeof b);
bulidtree(s2,b);
int f = 1;
for(int j=1; j< maxn; j++)
if(a[j]!=b[j])
{
//cout<<j <<" "<<a[j]<<' '<<b[j]<<endl;
f = 0;
break;
}
if(f)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
}