二叉搜索树(二叉排序搜索树)

二叉搜索树

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4117    Accepted Submission(s): 1802

Problem Description

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

Input

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

Output

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

Sample Input

2
567432
543267
576342
0

Sample Output

YES
NO

题解:省赛有道树的形状相同的题,我还以为这个也是形状,错了几次,这个数值和树形都相同;想到省赛那题一直wa,现在想想要想判断树形相同,先序中序遍历都应该相同;我只是判断了位置,应该是不正确的。。。

这个不知道为啥只要先序就可以了。。。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef struct Node{
    Node *l, *r;
    char c;
    Node(){l = NULL; r = NULL;}
}*tree, Node;
void build(Node* &p, char c){
    if(p == NULL){
        p = new Node();
        p->c = c;
        return;
    }
    if(c < p->c)
        build(p->l, c);
    else
        build(p->r, c);
}

void InOrder(tree p, string& s){
    if(p == NULL)return;
    InOrder(p->l, s);
    s += p->c;
    InOrder(p->r, s);
}

void PreOrder(tree p, string& s){
    if(p == NULL)return;
    s += p->c;
    PreOrder(p->l, s);
    PreOrder(p->r, s);
}

int main(){
    int n;
    char dt[15];
    string ans1, ans2, s1, s2;
    while(scanf("%d", &n), n){
        Node *p;
        cin >> dt;
        p = NULL;
        for(int i = 0; dt[i]; i++){
            build(p, dt[i]);
        }
        ans1 = "";
        PreOrder(p, ans1);
        ans2 = "";
        InOrder(p, ans2);
    //    cout << ans1 << endl << ans2 << endl;
        for(int j = 0; j < n; j++){
            p = NULL;
            cin >> dt;
            for(int i = 0; dt[i]; i++){
                build(p, dt[i]);
            }
            s1 = "";
            PreOrder(p, s1);
            s2 = "";
            InOrder(p, s2);
    //        cout << s1 << endl << s2 << endl;
            if(s1 == ans1 && s2 == ans2)
                puts("YES");
            else
                puts("NO");
        }
    }
    return 0;
}
时间: 2024-10-07 16:08:33

二叉搜索树(二叉排序搜索树)的相关文章

将二叉搜索树转变成排序的双向链表

将二叉搜索树转变成排序的双向链表: 点击链接: http://blog.csdn.net/l_tudou/article/details/51753921

算法导论第十二章__二叉搜索数

package I第12章__二叉搜索树; //普通二叉树 public class BinaryTree<T> { // -----------------------数据结构--------------------------------- private int height = 0; private Node<T> rootNode; class Node<T> { T t; int key; Node left; Node right; public Node

TYVJ P1051 选课 Label:多叉转二叉&amp;&amp;树形dp(虐心?)

描述 学校实行学分制.每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分.学校开设了N(N<300)门的选修课程,每个学生可选课程的数量M是给定的.学生选修了这M门课并考核通过就能获得相应的学分. 在选修课程中,有些课程可以直接选修,有些课程需要一定的基础知识,必须在选了其它的一些课程的基础上才能选修.例如<Frontpage>必须在选修了<Windows操作基础>之后才能选修.我们称<Windows操作基础>是<Frontpage>的先修课

14周(二维数组姓名成绩排序)

/* *copyright(c) 2014,烟台大学计算机学院 *All rights reserved. *文件名称:14周(二维数组姓名成绩排序) *作者:王忠 *完成日期:2014.12.01 *版本号:v1.0 * *问题描述:初始化同学的成绩,姓氏,按大小排序 *输入描述:无 *程序输出:按照姓名或者成绩大小排序并输出 #include <iostream> #include <string> using namespace std; const int num=8; i

14周(二维数组成绩姓名排序)

/* *copyright(c) 2014,烟台大学计算机学院 *All rights reserved. *文件名称:14周(二维数组成绩姓名排序) *作者:王忠 *完成日期:2014.12.01 *版本号:v1.0 * *问题描述:初始化同学的成绩,姓氏,按大小排序 *输入描述:无 *程序输出:按照姓名或者成绩大小排序并输出 #include <iostream> #include <string> using namespace std; const int num=8; i

将二叉搜索树转换成排序的双向链表

分析: 1. 二叉树的中序遍历正好是排好序的遍历方式,因此可以采用中序递归的方式来处理: 2. 可以用类似输出流的方式来"输出"节点到链表末尾: 3. 可以用局部变量来简化判断,优化程序. 程序: typedef struct tagTreeNode_s { int nValue; tagTreeNode_s* pLeftNode; tagTreeNode_s* pRightNode; } TreeNode_s; void AppendNode(TreeNode_s* pNode, T

题目1009:二叉搜索树(二叉搜索树的建立)

题目链接:http://ac.jobdu.com/problem.php?pid=1009 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: // // 1009 二叉搜索树.cpp // Jobdu // // Created by PengFei_Zheng on 09/04/2017. // Copyright © 2017 PengFei_Zheng. All rights reserved. // #include <stdi

PHP生成二维码二种方法和实例

PHP生成二维码的两个方法和实例,分别使用Google API和PHP二维码生成类库PHP QR Code实现. 之前介绍过通过使用jQuery插件来生成二维码,今天分享下如何使用PHP生成二维码,以及如何生成中间带LOGO图像的二维码.利用Google API生成二维码Google提供了较为完善的二维码生成接口,调用API接口很简单,以下是调用代码: $urlToEncode="http://www.jbxue.com"; generateQRfromGoogle($urlToEnc

hdu1823 Luck and Love 二维RMQ(二维线段树)

题意:给定你二维范围,找这个范围里面的最大值 解题思路:二维线段树有两种实现方式,一种是  树套树  ,另一种则是将二维平面分成4块的  完全四叉树 我的代码: // File Name: 1823.cpp // Author: darkdream // Created Time: 2014年07月10日 星期四 09时38分05秒 #include<vector> #include<list> #include<map> #include<set> #in