二叉搜索树,又名二叉排序树,它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值。
结构体:
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