【树】问题 B: 二叉搜索树

题目描述

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

输入

开始一个数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 <string>

using namespace std;

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

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

    if(root -> data == e){
        return;
    }else if(root -> data > e){
        insertTree(root -> lchild, e);
    }else{
        insertTree(root -> rchild, e);
    }
}
void Spreorder(node* root, string &s){
    if(root == NULL) return;
    s += root -> data;
    Spreorder(root -> lchild, s);
    Spreorder(root -> rchild, s);
}
int main()
{
    int n;
    string s;
    while(cin >> n && n != 0){
        cin.get();

        node* T = NULL;
        getline(cin, s);
        for(int i = 0; i < s.size(); i++){
            insertTree(T, s[i]);
        }
        string s1;
        Spreorder(T, s1);

        for(int i = 0; i < n; i++){
            node* T1 = NULL;
            getline(cin, s);
            for(int i = 0; i < s.size(); i++){
                insertTree(T1, s[i]);
            }
            string temp;
            Spreorder(T1, temp);
            if(s1 == temp) cout << "YES\n";
            else cout << "NO\n";
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值