二叉搜索树

判断两序列是否为同一二叉搜索树序列

耻辱题啊。

建树时一定要传引用!

建树时一定要传引用!

建树时一定要传引用!

若两个树的前序遍历和中序遍历都相同,则他们是同一棵树。

给出两个方法:

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值