[二叉查找树] 二叉搜索树

题目描述

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

输入

开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。

输出

如果序列相同则输出YES,否则输出NO

样例输入

6 45021 12045 54120 45021 45012 21054 50412 0

样例输出

NO NO YES NO NO NO

分析:在建立二叉查找树时,不同的插入序列可能得到相同的二叉查找树。这里写了一个比较函数,用于比较两颗二叉树是否相同。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#include <queue>
using namespace std;

struct node
{
    char data;
    node *lchild,*rchild;
};

bool judge(node * root1,node * root2)
{
    if(root1==NULL&&root2!=NULL) return false;
    else if(root1!=NULL&&root2==NULL) return false;
    else if(root1==NULL&&root2==NULL) return true;
    else
    {
        if(root1->data!=root2->data) return false;
        else return judge(root1->lchild,root2->lchild)&&judge(root1->rchild,root2->rchild);
    }
}

void insert(node * &root,char data)
{
    if(root==NULL)
    {
        root=new node;
        root->data=data;
        root->lchild=NULL;
        root->rchild=NULL;
        return ;
    }
    if(root->data==data) return ;
    else if(data<root->data)
    {
        insert(root->lchild,data);
    }
    else
    {
        insert(root->rchild,data);
    }
}

int main()
{
    int n;
    while(cin>>n)
    {
        if(n==0) break;
        string input;
        node * root=NULL;
        cin>>input;
        for(int i=0;i<input.length();i++)
        {
            insert(root,input[i]);
        }
        
        string tmp;
        for(int i=0;i<n;i++)
        {
            node * test_tree=NULL;
            cin>>tmp;
            for(int j=0;j<tmp.length();j++)
            {
                insert(test_tree,tmp[j]);
            }
            if(judge(root,test_tree))
            {
                cout<<"YES"<<endl;
            }
            else
            {
                cout<<"NO"<<endl;
            }
        }
        
        
    }
    return 0;
}

 

posted @ 2017-02-22 21:57  Num.Zero  阅读(543)  评论(0编辑  收藏  举报