二叉搜索树

孤街醉人 提交于 2020-02-28 04:39:26

   二叉搜索树,又名二叉排序树,它或者是一棵空树,或者是具有下列性质的二叉树 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值。

结构体:

 

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;
}

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!