二叉搜索树,又名二叉排序树,它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值。
结构体:
struct tree
{
char key;
tree *left;
tree *right;
};
插入函数:
void intree(tree *tr,tree *temp)
{
if(tr->key>temp->key)
{
if(tr->left==NULL)
tr->left=temp;
else
intree(tr->left,temp);
}
else
{
if(tr->right==NULL)
tr->right=temp;
else
intree(tr->right,temp);
}
}
例题:hdu 3791
连接:http://acm.hdu.edu.cn/showproblem.php?pid=3791
解析:建立二叉搜索树,然后利用中序遍历返回字符串,查看字符串是否相等。
代码:
#include<iostream>
#include<string>
using namespace std;
struct tree
{
char key;
tree *left;
tree *right;
};
void intree(tree *tr,tree *temp)//插入
{
if(tr->key>temp->key)
{
if(tr->left==NULL)
tr->left=temp;
else
intree(tr->left,temp);
}
else
{
if(tr->right==NULL)
tr->right=temp;
else
intree(tr->right,temp);
}
}
void buildtree(tree *t,string str) //建立二叉树
{
int len=str.length();
tree *p;
if(len!=0)
{
t->key=str[0];
t->left=t->right=NULL;
}
for(int i=1;i<len;i++)
{
p=t;
tree *temp=new tree();
temp->key=str[i];
temp->left=temp->right=NULL;
intree(t,temp);
}
}
string gettree(tree *tr) //中序遍历、返回字符串。
{
string str="";
str+=tr->key;
if(tr->left!=NULL)
{
str=str+gettree(tr->left);
}
if(tr->right!=NULL)
{
str=str+gettree(tr->right);
}
return str;
}
int main(){
int n;
while(cin>>n&&n!=0)
{
tree *tr=new tree[n+1];
string *str=new string[n+1];
cin>>str[0];
buildtree(&tr[0],str[0]);
str[0]=gettree(&tr[0]);
for(int i=1;i<=n;i++)
{
cin>>str[i];
buildtree(&tr[i],str[i]);
if(str[0]==gettree(&tr[i]))
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
delete tr;
}
return 0;
}
来源:https://www.cnblogs.com/liuxiaobao/p/8366770.html