「二叉树」HDOJ3791 二叉搜索树的生成序列比较

HDOJ3791<二叉搜索树>

在这里插入图片描述

题意概述:

给出两个二叉搜索树的生成序列,判断是否能生成相同的二叉搜索树。

解决:

二叉搜索树的生成序列有以下的特点:

  1. 根结点在最前面
  2. 左子树为小于根结点的所有结点,右子树为大于根结点的所有结点

而我们又知道:

   如果两个树相同,只需要使他们的根结点、左子树、右子树相同就行了。

而左子树和左子树相同又成为了一个本问题的小问题,所以我想到了使用递归来设计函数。

判断函数:

bool IfEqual(string a,string b){//使用字符串来存储序列
    if((a.size()==1&&b.size()==1&&a[0]==b[0])||(a.empty()&&b.empty())) return 1;//如果生成序列为空,则相同;如果序列只有一个元素且相同,则相同
    else if(a[0]!=b[0]) return 0;//如果根结点不同则两序列生成树不同
    else {
        string la,ra,lb,rb;//生成左右子树的序列
        for(int i:a){
            if(i<a[0]) la.push_back(i);
            else if(i>a[0])ra.push_back(i);
        }
        for(int i:b){
            if(i<b[0]) lb.push_back(i);
            else if(i>b[0]) rb.push_back(i);
        }
        return IfEqual(la,lb)&&IfEqual(ra,rb);//根结点和左子树和右子树分别都相同
    }
}

总体思路是:
设有a,b两个序列待判断是否相同
IfEqual(a,b) = Root(a)==Root(b) && IfEqual(lchildTree(a),lchildTree(b))&&IfEqual(rchildTree(a),rchildTree(b))

总体代码:

//
// Created by MacBook on 2020/6/16.
//

#include <iostream>
#include <string>
using namespace std;

bool IfEqual(string a,string b){
    if((a.size()==1&&b.size()==1&&a[0]==b[0])||(a.empty()&&b.empty())) return 1;
    else if(a[0]!=b[0]) return 0;
    else {
        string la,ra,lb,rb;
        for(int i:a){
            if(i<a[0]) la.push_back(i);
            else if(i>a[0])ra.push_back(i);
        }
        for(int i:b){
            if(i<b[0]) lb.push_back(i);
            else if(i>b[0]) rb.push_back(i);
        }
        return IfEqual(la,lb)&&IfEqual(ra,rb);//根结点和左子树和右子树分别都相同
    }
}

int main(){
    string pure,b;
    int n;
    while( cin>>n && n != 0){
        cin>>pure;
        while(n--){
            cin>>b;
            cout<<(IfEqual(pure,b)==1?"YES":"NO")<<endl;
        }
    }



    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值