PAT 1043 Is It a Binary Search Tree (25分) 由前序遍历得到二叉搜索树的后序遍历

PAT甲级真题 1043 Is It a Binary Search Tree (25分) C++实现(二叉搜索树,递归前序转后序) 题目 A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: The left subtree of a node contains only nodes with keys less than the node’s key. The right s... 阅读详情

题目

A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties:

  • The left subtree of a node contains only nodes with keys less than the node’s key.
  • The right subtree of a node contains only nodes with keys greater than or equal to the node’s key.
  • Both the left and right subtrees must also be binary search trees.

If we swap the left and right subtrees of every node, then the resulting tree is called the Mirror Image of a BST.

Now given a sequence of integer keys, you are supposed to tell if it is the preorder traversal sequence of a BST or the mirror image of a BST.

Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer N (≤1000). Then N integer keys are given in the next line. All the numbers in a line are separated by a space.

Output Specification:
For each test case, first print in a line YES if the sequence is the preorder traversal sequence of a BST or the mirror image of a BST, or NO if not. Then if the answer is YES, print in the next line the postorder traversal sequence of that tree. All the numbers in a line must be separated by a space, and there must be no extra space at the end of the line.

Sample Input 1:
7
8 6 5 7 10 8 11
Sample Output 1:
YES
5 7 6 8 11 10 8
Sample Input 2:
7
8 10 11 8 6 7 5
Sample Output 2:
YES
11 8 10 7 5 6 8
Sample Input 3:
7
8 6 8 5 10 9 11
Sample Output 3:
NO

题目解读

给定一个输入序列,判断它是否是一棵二叉搜索树或其镜像树的前序遍历序列,如果是,输出 YES 以及它的后序遍历序列;如果不是,输出 NO。

二叉搜索树的定义:

  • 左子树所有节点的键值小于根节点
  • 右子树所有节点的键值大于等于根有点
  • 左子树和右子树也必须是二叉搜索树(满足上面两点)

镜像树:交换原二叉搜索树每个节点的左右子树。所以它满足:

  • 左子树所有节点的键值大于等于根节点
  • 右子树所有节点的键值小于根有点
  • 左子树和右子树也必须满足上面两点

首先我们应该明白一个道理:

一般情况下,我们要根据一棵二叉树的前序遍历结果和中序遍历结果才能得到它的后序遍历结果,但这里为什么只需要前序遍历结果就可以得到后序遍历结果?

二叉搜索树又叫二叉排序树,由它的定义就知道它本身是有序的,对一棵二叉搜索树进行中序遍历,得到就是一个非降序有序序列,这也可以作为一种排序方法。

所以如果给出的序列的确是一棵二叉搜索树的前序遍历的话,对它进行一次排序就能得到它的中序遍历结果,前序+中序就能得到后序,所以需要明白这个隐含条件。

思路分析

你可以选择用给出的输入构造出一棵二叉搜索树,然后再对这棵树进行前序遍历,判断得到的结果是否和输入一致,如果不一致,那就输出 NO,如果一致就输出这这棵树的后序遍历结果。

我这里参考了柳神的代码,采用了一种更为简单的方法。

可以想象一下,根据 前序遍历结果和中序遍历结果能得到正确的后序遍历结果,那,如果给出的前序结果是错误的呢(它不是一棵二叉搜索树的前序结果),那肯定不能得到正确的后序遍历结果,假如我用一个vector来保存在此过程中得到的节点序列,那么最终这个vector中的节点个数肯定不够原来输入的个数(当然前提是算法正确)。

所以我们可以假设这个输入序列是对的,然后利用这个输入序列去得到后序序列并保存,如果最终得到的结果中节点个数不够,那说明它不是正确的前序遍历,否则就直接输出得到的结果。

当然这里还多了一步,如果把它当作前序遍历序列不能得到正确结果,我们还要把它当作二叉搜索树的镜像树的前序结果再执行一次这个过程,如果这次还不能得到正确结果,那说明它的确是错误的前序序列。

接下来我们来研究一下这个算法怎么写:

对于一棵二叉搜索树,因为它的有序性,对他进行前序遍历(根,左子树,右子树),得到的序列肯定满足这个样子:根节点 所有比它小的节点 所有比它的大的节点。

比如下面这棵二叉搜索树
在这里插入图片描述
它的前序遍历结果是 8 567 91011,是不是很有特点,我们能根据这个很好的划分出它的左右子树:

  • 当前树根是8,设置左指针i,初始是8的下一个位置,右指针j,初始是当前树最后一个有效位置
  • i从左往右,扫描前序序列,遇到比根小的就i++,会停在9的位置;
  • j从右往左,扫描前序序列,遇到比根大于或等于的就j--,最后会停在7的位置
  • 这样一次扫描后,应该满足 j + 1 == i,对于每一个二叉搜索树的前序遍历都应该满足这个特点,所以这里可以作为函数的一个出口,不满足,就退出
  • 划分成左右两部分后,因为我们要得到后序遍历(左,右,中),所以对做左子树进行这个处理,对右子树进行这个处理,把当前树根加入vector,注意顺序不能乱!

从上面可以看出:

  • 这个函数需要两个参数,一个是当前树的根,一个是当前树最后一个节点在前序序列中的位置
  • 每次双指针扫描结束后,不满足 i == j + 1 就退出
  • 最小的子树是只有一个节点,此时这两个参数应该相等,所以函数刚进来的时候,判断一个,如果根的位置 > 最后一个有效位置,就直接退出。

上面的过程是针对于 把输入序列当作二叉搜索树的前序遍历进行的,如果要把输入序列当作镜像树的前序遍历序列呢?很简单,根据对称性,只需要把 i 和 j 的扫描时的判断条件取个反就行了,也就是 > 变成 <=,> 变成 <=.

所以你可以写成两个函数分别处理这两种情况,也可以设置一个标志在函数内部分情况,我选择第二种,直接看代码很清楚。

综上,总体执行流程为:

  • 把输入序列当作二叉搜索树前序遍历,执行这个函数,得到后序结果,
  • 如果所得结果中节点个数与输入一致,直接输出
  • 如果不一致,把输入序列当作二叉搜索树镜像树的前序遍历,也就是改变标志位,再执行一次这个函数,得到后序结果
  • 再判断所得结果中节点个数是否与输入一致,一致则输出,不一致则输出 NO。

完整代码

#include<iostream>
#include<vector>
using namespace std;
// 前序遍历序列,后序遍历序列
vector<int> pre, post;
// 是否当作二叉搜索树的镜像树处理
bool ismirror = false;

// 当前处理的树的根节点在前序序列中的下标
// 当前处理的树最后一个节点在前序序列中的有效位置
void GetPost(int root, int tail) {
    // 最小的树就一个节点,root=tail
    if (root > tail) return;
    int i = root + 1, j = tail;
    // 当作二叉搜索树树处理
    if (!ismirror) {
        // 左孩子都小于根
        while (i <= tail && pre[i] < pre[root]) i++;
        // 右孩子都大于等于根
        while (j > root && pre[root] <= pre[j]) j--;
    // 当作二叉搜索树的镜像树处理
    } else {
        // 左孩子都大于等于根
        while (i <= tail && pre[i] >= pre[root]) i++;
        // 右孩子都小于根
        while (j > root && pre[root] > pre[j]) j--;
    }
    // 不满足二叉搜索树前序遍历结果特点
    if (i != j + 1) return;
    // 对左子树执行此操作
    GetPost(root + 1, j);
    // 对右子树执行此操作
    GetPost(i, tail);
    // 保存当前根
    post.push_back(pre[root]);
}

int main() {
    int n;
    cin >> n;
    pre.resize(n);
    for (int i = 0; i < n; ++i) cin >> pre[i];
    // 当作前序遍历结果,尝试得到后序结果
    GetPost(0, n - 1);
    // 所得结果节点个数错误
    if (post.size() != n) {
        // 改变标志位
        ismirror = true;
        post.clear();
        // 当作镜像树前序遍历结果,尝试获取后序结果
        GetPost(0, n - 1);
    }
    // 所得结果正确
    if (post.size() == n) {
        cout << "YES" << endl;
        cout << post[0];
        for (int i = 1; i < n; ++i) cout << " " << post[i];
    // 所得结果依然错误
    } else {
        cout << "NO";
    }
    return 0;
}

sentinel滑动时间窗口算法学习 滑动时间窗口 先不说sentinel的算法实现,先说什么是滑动时间窗口, 我们在进行限流的时候,比如通过QPS进行限流,那假如我们以秒为单位,举个例子: 我设置了限流规则,qps是10 如果不使用滑动窗口算法,在统计qps的时候,就有可能会有问题,比如: 在0 - 500ms中的请求数是0,但是在500ms - 1000 ms的请求数是10;在1000ms - 1500ms 之间又进来了5个请求,此时只判断了1000ms - 2000 ms之间的请求数 因为没有把1S进行拆分多个窗口,所以在1000ms之后 阅读详情

相关推荐

保姆级教程:用杰理701N可视化SDK搞定ANC降噪配置(从工具到代码全流程)

本文提供了一份详细的杰理701N可视化SDK配置ANC降噪功能的教程,涵盖从开发环境搭建到代码集成的全流程。通过图形化工具和代码示例,帮助开发者快速掌握ANC参数配置技巧,优化降噪效果,解决常见问题。

weixin_30616969的博客 451

二叉树中序遍历

二叉树中序遍历 中序遍历 顺序为:左子树->跟节点->右子树 先遍历左子树,然后遍历跟节点,最后遍历右子树,以此轮推,直到遍历完所有节点。 6 ------------- 4 8 -------- ------- 2 5 7 9

lq 5671

CODESYS Softmotion(一)功能介绍

一、CODESYS SoftMotion RTE SL产品 1.1 CODESYS Runtime SL 产品家族介绍 目前支持的主流厂商的硬件产品,让部署在上面的成为实时设备。 对于Windows系统,根据需求选择对应的Runtime: RTE极大的提高了实时性,适合进行运动控制,同时RTE还支持了多个主从站协议: 还可以选择可选的功能(Single License): RTE对硬件和系统有要求,如果你需要硬件功能,那么网卡会有最低要求。 1.2 RTE的下载和安装 在官网http://codes

Fishfishfishfishcat 2万+

二叉搜索树及中序遍历

二叉搜索树的概念 二叉搜索树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根节点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。二叉搜索树作为一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势;所以应用十分广泛,例如在文件系统和数据库系统一般会采用这种数据结构进行高效率的排序与检索操作。 图..

繁华街角的歇脚处 5810

GPS从入门到放弃(一) --- GPS基础原理

GPS从入门到放弃(一) — GPS基础原理 GPS,全称Global Positioning System,已经广泛应用于我们的日常生活中了,现在的智能手机 里都会自带GPS定位功能。这是一个美国的全球定位系统,虽然我们现在也有北斗了,但毕竟GPS搞的早,所以先从它开始研究起。 整个GPS系统分三大部分: 地面站 卫星 接收机 地面站负责监控。它们通过接收、测量各个卫星信号,计算卫星的运行轨...

tyst08的专栏 2万+

别让IO口保护二极管坑了你!实测讲解单片机电流倒灌的三种典型症状与防护

本文深入解析单片机电流倒灌的三大典型症状与防护方案,重点分析STM32等单片机在ADC采样异常、系统假死和通信速率异常中的表现。通过实测数据和电路设计建议,提供从基础二极管隔离到专业隔离器件的分级防护策略,帮助工程师有效预防和解决电流倒灌问题。

weixin_29280219的博客 344

二叉树遍历方法——前、中、后序遍历(图解)

二叉树的前、中、后序遍历的递归与非递归算法

在夜里行走的博客 17万+

Geogebra中级篇016—矩阵(Matrices)

在GeoGebra中,矩阵是一种强大的工具,广泛应用于线性代数、几何变换和数据处理等领域。通过矩阵,我们可以轻松实现复杂的计算和图形变换,如旋转、平移和缩放等操作。不仅如此,GeoGebra的矩阵功能还支持多种运算,如加法、乘法、求逆等,使得用户能够高效地处理线性方程组和向量空间问题。在本文中,我们将深入探讨GeoGebra中的矩阵功能,详细介绍如何创建矩阵、执行常见的矩阵运算,并通过实例展示这些操作在数学和工程应用中的实际价值。这篇文章将为你提供关于GeoGebra矩阵操作的全面指南。

八荒启-交互动画的博客 2584

JS:二叉搜索树(1)——中序遍历,基础操作

Binary Search Tree 简单总结下吧,BST 相关的问题,要么利用 BST 左小右大的特性提升算法效率,要么利用中序遍历的特性满足题目的要求,也就这么些事儿吧。 230. 二叉搜索树中第K小的元素 给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。 BST 的中序遍历其实就是升序排序的结果 var kthSmallest = function(root, k) { let res = 0, rank = 0;

ronghwa_lu 1955

人工智能技术基础系列之:迁移学习

作者:禅与计算机程序设计艺术 1.背景介绍 随着深度学习和神经网络的快速发展,越来越多的应用场景需要处理大量的数据和复杂的任务。然而,由于计算资源、存储空间等条件的限制,传统的人工智能方法往往不能满足实际需求。因此,为了提高效率和降低成本,研究人员提出了迁移学习的概念。本篇文章将详细介绍迁移学习的基

AI天才研究院 699

Microsemi Libero系列教程(六)——Identify片上逻辑分析仪的使用

文章目录FPGA如何进行在线调试关于Microsemi片上逻辑分析仪FPGA片上逻辑分析仪原理预期效果0.准备一个创建好的Libero工程1.新建identify工程,并添加想要监测的信号2.管脚分配,编译下载3.设置触发类型4.IICE逻辑分析仪核资源占用 系列教程:Microsemi Libero系列教程 FPGA如何进行在线调试 对于嵌入式系统来说,如单片机,进行硬件级程序调试时,通常采用的是JLink/ST-Link调试器,在线调试的方式来获取程序实时运行的状态,可以观察程序运行流程、各种变量的值

whik1194的博客 1万+

【数据结构】二叉树的前序遍历、中序遍历、后序遍历、层序遍历

二叉树的遍历是学习二叉树首先要会的,这里从深度优先遍历(前、中、后序)和广度优先遍历(层序)两方面来详细解释如何遍历二叉树,深度优先遍历使用递归方法。

m0_65679465的博客 8705

《QGIS快速入门与应用基础》230:添加图例工具

本文系统讲解QGIS图例制作的核心方法与优化技巧。首先强调图例与地图框的绑定逻辑,提出三种绑定状态及适用场景。详细拆解三种图例添加方法:布局工具栏一键添加法(新手首选)、菜单栏添加法和右键快捷创建法,并给出单地图框和多地图框两种典型场景的规范技巧。重点解决新手常见的图例杂乱、样式不规范、内容脱节等问题,帮助用户从基础图例制作进阶到符合行业标准的专业图例设计。通过分步操作图示和实用技巧,使读者能够快速掌握图例创建的核心流程与优化方法。

LuckyHanMo的博客 550

1043. Is It a Binary Search Tree (25)-PAT甲级真题

1043. Is It a Binary Search Tree (25) A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: The left subtree of a node contains only nodes wi

柳婼 の blog 3026

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

浙大 PAT 1043. Is It a Binary Search Tree (25)

1043. Is It a Binary Search Tree (25) 时间限制 400 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A Binary Search Tree (BST) is r

凌风 5207

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

1043 Is It a Binary Search Tree (25 分)(算法笔记)

1043 Is It a Binary Search Tree (25 分) … Input Specification: Each input file contains one test case. For each case, the first line contains a positive integer N (≤1000). Then N integer keys are given...

ostrich的博客 946

PAT 1043. Is It a Binary Search Tree (25)

http://pat.zju.edu.cn/contests/pat-a-practise/1043

Steve Sun的专栏 2693

PAT 甲级 1043  Is It a Binary Search Tree

1043 Is It a Binary Search Tree (25 point(s)) A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: The left subtree of a node contains only nodes wi...

漫浸天空的雨色的备忘录~ 1085

精解1043. Is It a Binary Search Tree (25)-PAT甲级真题

1043. Is It a Binary Search Tree (25)-PAT甲级真题 A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: The left subtree of a node contains only nodes wit...

honeyShi's Blog 890

1043 Is It a Binary Search Tree (25 分)二叉搜索树的先序遍历

题目 A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: The left subtree of a node contains only nodes with keys less than the node’s key. The right s...

大山喵写博客的地方 809

PAT-A1043 Is It a Binary Search Tree 题目内容及题解

A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: The left subtree of a node contains only nodes with keys less than the node's key. The right su...

BourbonWhiskey 的博客 739

1043 Is It a Binary Search Tree (25)

of a BST.

2401_88085478的博客 748

PAT A 1043 Is It a Binary Search Tree

摘要: 题目要求判断给定的整数序列是否为二叉搜索树(BST)或其镜像树的前序遍历序列。若是,则输出对应的后序遍历序列。程序首先构建BST,生成其前序和镜像前序序列与输入比较。若匹配BST前序,输出常规后序;若匹配镜像前序,输出镜像后序(右左根顺序)。否则输出NO。关键步骤包括插入建树、前序遍历验证及后序遍历输出。 关键词: 二叉搜索树、前序遍历、镜像树、后序遍历、序列验证

whdehcy的博客 1062

1043 Is It a Binary Search Tree (25 分) BST 题意坑

1043Is It a Binary Search Tree(25分) A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: The left subtree of a node contains only nodes with keys...

树叶子的博客 523

[PAT]1043 Is It a Binary Search Tree (25 分)

一、题意 A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: The left subtree of a node contains only nodes with keys less than the node's key. The ri...

刘好念的博客 329

1043 Is It a Binary Search Tree

题目来源:PAT (Advanced Level) Practice A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: The left subtree of a node contains only nodes with keys less than the node's key. The right subtree of a node cont

weixin_51032998的博客 377

PAT 1043 Is It a Binary Search Tree [二叉搜索树]

A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: The left subtree of a node contains only nodes with keys less than the node's key. The right su...

咸鱼夏の翻身观察记录 522
上一篇: PAT1042 Shuffling Machine (20分) 用1-54代替点数更方便哦
下一篇: PAT 1044 Shopping in Mars (25分) 二分法
wwang_dev
博客等级 码龄7年 27粉丝 76原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值