PTA L2-004 这是二叉搜索树吗?

一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,

  • 其左子树中所有结点的键值小于该结点的键值;
  • 其右子树中所有结点的键值大于等于该结点的键值;
  • 其左右子树都是二叉搜索树。

所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树。

给定一个整数键值序列,现请你编写程序,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果。

输入格式:

输入的第一行给出正整数 N(≤1000)。随后一行给出 N 个整数键值,其间以空格分隔。

输出格式:

如果输入序列是对一棵二叉搜索树或其镜像进行前序遍历的结果,则首先在一行中输出 YES ,然后在下一行输出该树后序遍历的结果。数字间有 1 个空格,一行的首尾不得有多余空格。若答案是否,则输出 NO

输入样例 1:

7
8 6 5 7 10 8 11

输出样例 1:

YES
5 7 6 8 11 10 8

输入样例 2:

7
8 10 11 8 6 7 5

输出样例 2:

YES
11 8 10 7 5 6 8

输入样例 3:

7
8 6 8 5 10 9 11

输出样例 3:

NO

注意:

若测试点0和3错了,检查一下左子树的代码,或者检查 确定左右子树的分界点 的代码 尤其是分界点下标的确定。

若你交代码一会 对 一会 不对 或则 段错误,检查代码中的下标是否有越界的可能。

代码(建树版):

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

const int N = 1010;

struct Node
{
    int val;
    Node* lchild;
    Node* rchild;
}a[N];

int pre[N],post[N],a_id,post_id;
int flag = 1;

void init()
{
    post_id = 0;
    a_id = 0;
    
    memset(a,0,sizeof a);
    memset(post,0,sizeof post);
}

Node* build_tree(int l,int r)
{
    if(l > r) return NULL;

    Node* root = &a[a_id++];
    root->val = pre[l];
    
    int mid = l + 1;
    if(flag)//左小
    {
        //注意下标 mid <= r
        while(mid <= r && pre[mid] < pre[l]) mid++;
        for(int i = mid;i <= r;i++)//检查
            if(pre[i] < pre[l]) return NULL;
    }
    else//左大
    {
         //注意下标 mid <= r
        while(mid <= r && pre[mid] >= pre[l]) mid++;
        for(int i = mid;i <= r;i++)//检查
            if(pre[i] >= pre[l]) return NULL;
    }
    root->lchild = build_tree(l + 1,mid - 1);
    root->rchild = build_tree(mid,r);
    
    post[post_id++] = root->val;//后序遍历
    
    return root;
}

int main()
{
    int n = 0;
    scanf("%d",&n);

    for(int i = 0;i < n;i++) scanf("%d",&pre[i]);
    Node* root = build_tree(0,n - 1);
    if(post_id != n)
    {
        init();flag = 0;//左大
        root = build_tree(0,n - 1);
    }

    if(post_id == n)
    {
        puts("YES");
        for(int i = 0;i < n;i++)
            printf("%d%c",post[i],i == n - 1 ? '\n' : ' ');
    }
    else puts("NO");
    return 0;
}

代码(不建树版):

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>

using namespace std;

const int N = 1010;

int pre[N];
vector<int> post;
bool flag = true;

void build_tree(int l,int r)
{
    if(l > r) return;

    int mid = l + 1;
    if(flag)//左小
    {
        while(mid <= r && pre[mid] < pre[l]) mid++;
        //检查
        for(int i = mid;i <= r;i++)
            if(pre[i] < pre[l]) return;

        
    }
    else//左大
    {
        while(mid <= r && pre[mid] >= pre[l]) mid++;
        //检查
        for(int i = mid;i <= r;i++)
            if(pre[i] >= pre[l]) return;
    }
    
    build_tree(l + 1,mid - 1);
    build_tree(mid,r);
    
    post.push_back(pre[l]);//后序遍历
    return ;
}

int main()
{
    int n = 0;
    scanf("%d",&n);
    for(int i = 0;i < n;i++) scanf("%d",&pre[i]);
    
    build_tree(0,n - 1);
    if(post.size() != n)
    {
        post.clear();
        flag = false;
        build_tree(0,n - 1);
    }
    if(post.size() == n)
    {
        puts("YES");
        for(int i = 0;i < post.size();i++)
            printf("%d%c",post[i],i == n - 1 ? '\n' : ' ');
    }
    else puts("NO");
    return 0;
}

结果: 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/443922.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

减少PDF文件大小的方法,亲测巨好用!!!

周六晚上&#xff0c;导师突然发了两个pdf&#xff0c;让把大小改成1M以下&#xff01;&#xff01;&#xff01; 试了很多方法最后&#xff0c;发现了个最好使用的&#xff0c;不过需要下载下Adobe Acrobat文件编辑软件&#xff0c;下载地址如下 链接&#xff1a;https://pan.…

基于Java的开放实验室管理系统(Vue.js+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 实验室类型模块2.2 实验室模块2.3 实验管理模块2.4 实验设备模块2.5 实验订单模块 三、系统设计3.1 用例设计3.2 数据库设计 四、系统展示五、样例代码5.1 查询实验室设备5.2 实验放号5.3 实验预定 六、免责说明 一、摘…

LVS+Keepalived 高可用集群

一、Keepalived工具介绍 支持故障自动切换(Failover) 支持节点健康状态检查(Health Checking) 基于vrrp协议完成地址流动 为vip地址所在的节点生成ipvs规则(在配置文件中预先定义) 为ipvs集群的各RS做健康状态检测 基于脚本调用接口完成脚本中定义的功能&#xff0c;进而…

链表|19.删除链表的倒数第N个节点

力扣题目链接 struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {//定义虚拟头节点dummy 并初始化使其指向headstruct ListNode* dummy malloc(sizeof(struct ListNode));dummy->val 0;dummy->next head;//定义 fast slow 双指针struct ListNode* f…

springboot整合shiro的实战教程(一)

文章目录 1.权限的管理1.1 什么是权限管理1.2 什么是身份认证1.3 什么是授权 2.什么是shiro3.shiro的核心架构3.1 Subject3.2 SecurityManager3.3 Authenticator3.4 Authorizer3.5 Realm3.6 SessionManager3.7 SessionDAO3.8 CacheManager3.9 Cryptography 4. shiro中的认证4.1…

Cocos Creator 2d光照

godot游戏引擎是有2d光照的&#xff0c;用起来感觉还是很强大的&#xff0c;不知道他是怎么搞的&#xff0c;有时间看看他们怎么实现的。 之前一直以为cocos社区里面没有2d光照的实现&#xff0c;偶然看到2d实现的具体逻辑&#xff0c;现在整理如下&#xff0c; 一&#xff1…

CAS 登出方案

1.配置 CAS 服务器端 添加配置cas.logout.followServiceRedirects:true&#xff0c;使支持 CAS 退出时支持输入 service 参数为跳转路径 2.配置客户端服务,添加session清除操作 3.前端文件添加跳转重定向 1) 直接在客户端调用http请求/cas/logout去注销不能携带cookie信息, 无…

Jmeter 性能 —— 模拟百万高并发压测思路!

测试场景&#xff1a;模拟百万级的订单量一个物流信息的查询接口。 条件&#xff1a;接口响应时间<150ms以内。10万并发量每秒。 设计性能测试方案&#xff1a; 1、生产环境 10W/S --并发量&#xff08;架构师/技术负责人提供&#xff09;20台机器&#xff08;4G*4核配置…

【探索C++容器:set和map的使用】

[本节目标] 1. 关联式容器 2. 键值对 3. 树形结构的关联式容器 1. 关联式容器 在初阶阶段&#xff0c;我们已经接触过STL中的部分容器&#xff0c;比如&#xff1a;vector、list、deque、forward_list(C11)等&#xff0c;这些容器统称为序列式容器&#xff0c;因为其底层为…

第三百八十九回

文章目录 1. 概念介绍2. 使用方法2.1 获取所有时区2.2 转换时区时间 3. 示例代码4. 内容总结 我们在上一章回中介绍了"分享一些好的Flutter站点"相关的内容&#xff0c;本章回中将介绍timezone包.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在…

qsort函数的用法及参数的讲解

第一种用法展示&#xff1a;&#xff08;整形数组的qsort&#xff09; 一&#xff0c;qsort函数的定义&#xff1a; qsort 函数的定义&#xff1a;void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*)); 使用其需要包含头文件&#x…

Echarts 报提示 There is a chart instance already initialized on the dom.

问题原因&#xff1a; 每次执行 Echarts图例方法都会拿到相关的dom元素执行Echarts图例初始化操作 但是每次执行的时候拿到的dom元素又是相同的&#xff0c;Echarts初始化执行的时候检查到这个dom上面已经有了一个 图表了 就不会再重新拿到这个dom元素执行初始化操作 解决方案&…

CSRF攻击解析:原理、防御与应对策略

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【蓝牙协议栈】【经典蓝牙】【BLE蓝牙】蓝牙协议规范(射频、基带链路控制、链路管理)

目录 1. 蓝牙协议规范&#xff08;射频、基带链路控制、链路管理&#xff09; 1.1 射频协议 1.2 基带与链路控制协议 1.3 链路管理器 1. 蓝牙协议规范&#xff08;射频、基带链路控制、链路管理&#xff09; 蓝牙协议是蓝牙设备间交换信息所应该遵守的规则。与开放系…

【数据库】数据库学习使用总结DDL DML 及常用的条件查询语句

目录 一、数据库介绍 二、数据库系统 DBMS&#xff1a; 三、DDL 1、操作数据库&#xff08;创建和删除&#xff09; 创建表 ——也可以利用navicat等工具直接创建 删除表 2、约束&#xff1a; 主键约束 唯一的标识一条数据&#xff0c;该字段的数据不允许重复 主键不可…

从零到一,构建坚如磐石的Redis 7高可用集群:全程实录与关键技术详解

1、引言 在日常的开发中&#xff0c;无论是主从复制还是哨兵模式&#xff0c;都在高并发的场景中存在致命的缺点&#xff1a; 主从复制&#xff1a;当Master Redis机器挂掉之后&#xff0c;Slave依旧可以读取数据&#xff0c;但是由于Master不能写数据了&#xff0c;所以就会…

MyBatis框架

目录 一、MyBatis集成 1.项目搭建 1.1.idea中创建maven项目 1.2导入maven包 2.MyBatis集成 2.1MyBatis配置文件 2.2.创建MyBatisUtils 2.3 测试Mybatis是否可用 2.4.创建模型 2.5.productMapper接口 2.6创建productMapper.xml文件 2.7注册mapper.xml 3.1获取单个对象…

vue3项目报Parsing error: Cannot find module ‘typescript‘

vue3项目报Parsing error: Cannot find module ‘typescript’ 解决办法&#xff0c;安装typescript&#xff0c;然后一定记得 退出vscode&#xff0c;再重新打开项目即可。 npm install typescript --save-dev

【产品经理方法论——BRD文档模板】

一、BRD(Business Requirement Document)商业需求文档 BRD文档是面对公司高层&#xff0c;目的是获得公司资金、资源的支持开展项目。一般的BRD文档展示方式是PPT。 下面的思维导图是BRD文档的六大模块。 方案背景方案预测产品规划盈利模式收益与成本风险与对策 1. 方案背景 …

2024038期传足14场胜负前瞻

2024038期售止时间为3月10日&#xff08;周日&#xff09;20点30分&#xff0c;敬请留意&#xff1a; 本期深盘多&#xff0c;1.5以下赔率3场&#xff0c;1.5-2.0赔率2场&#xff0c;其他场次是平半盘、平盘。本期14场整体难度中等偏上。以下为基础盘前瞻&#xff0c;大家可根据…