题目

A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: The lef 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 lef and right subtrees must also be binary search trees. If we swap the lef 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

题目分析

已知二叉查找树节点序列,判断是其前序序列还是其镜像树的前序序列,并打印相应树的后序序列

解题思路

思路 01

  1. 输入测试数据时,分别建树和建镜像树
  2. 先用树的先序序列与原测试序列对比,若同即输出YES,若不同再用镜像树先序序列对比,若同输出YES,不同则NO
  3. 若为YES,打印相应后序序列

思路 02(最优、难理解)

  1. 输入测试数据时,建树
  2. 根据二叉查找树的性质(大于所有左子树节点,小于所有右子树节点)

    2.1 获取后序序列,若后序序列中的结点数与原测试用例结点数相同,即为二叉查找树的先序序列打印YES,若不同,清空,并进性镜像树的后序序列获取

    2.2 获取镜像树的后序序列结点数,若与原测试用例结点数相同,即为二叉查找树镜像树的先序序列YES,若不同,打印NO
  3. 若为YES,打印相应后序序列

知识点

二叉查找树的前序转后序,无需建树,可根据其性质(大于所有左子树节点,小于所有右子树节点)建树

如前序序列:8 6 5 7 10 8 11

8是根节点

左子树:从6开始往后找小于8的都为8的左子树节点

右子树:从最后一位11开始往前找大于8的都为8的右子树节点

继续递归过程,直到完成建树

Code

Code 01

#include <iostream>
#include <vector>
using namespace std;
struct node {
int data;
node * left=NULL;
node * right=NULL;
node() {}
node(int _data):data(_data) {}
};
node * root,* rootM;
void insert(int n, int b) {
if(root==NULL&&b==0) {
root = new node(n);
return;
}
if(rootM==NULL&&b==1) {
rootM = new node(n);
return;
}
node * p;
if(b==0)p=root;
else p=rootM;
while(p!=NULL) {
if((n<p->data&&b==0)||(n>=p->data&&b==1)) {
if(p->left==NULL) {
p->left=new node(n);
return;
}
p=p->left;
} else if((n>=p->data&&b==0)||(n<p->data&&b==1)) {
if(p->right==NULL) {
p->right=new node(n);
return;
}
p=p->right;
}
}
}
vector<int> origin,pre,post,preM,postM;
void preOrder(node * nd, int b) {
if(nd==NULL)return;
if(b==0)pre.push_back(nd->data);
else preM.push_back(nd->data);
preOrder(nd->left,b);
preOrder(nd->right,b);
}
void postOrder(node * nd, int b) {
if(nd==NULL)return;
postOrder(nd->left,b);
postOrder(nd->right,b);
if(b==0)post.push_back(nd->data);
else postM.push_back(nd->data);
}
int main(int argc,char * argv[]) {
int n,m;
scanf("%d",&n);
for(int i=0; i<n; i++) {
scanf("%d",&m);
origin.push_back(m);
insert(m,0);
insert(m,1);
}
// int flag = -1;//0 前序;1 镜像前序;2 NO
preOrder(root,0);
preOrder(rootM,1);
if(pre==origin) {
postOrder(root,0);
printf("YES\n");
for(int i=0; i<post.size(); i++) {
if(i!=0)printf(" ");
printf("%d",post[i]);
}
} else if(preM==origin) {
if(preM==origin) {
postOrder(rootM,1);
printf("YES\n");
for(int i=0; i<postM.size(); i++) {
if(i!=0)printf(" ");
printf("%d",postM[i]);
}
}
}else{
printf("NO\n");
}
return 0;
}

Code 02(最优、难理解)

#include <iostream>
#include <vector>
using namespace std;
vector<int> pre,post;
bool isMirror;
void getPost(int root, int tail) {
if(root>tail)return;
int i=root+1;
int j=tail;
if(!isMirror) {
while(i<=tail&&pre[i]<pre[root])i++;
while(j>root&&pre[j]>=pre[root])j--;
} else {
while(i<=tail&&pre[i]>=pre[root])i++;
while(j>root&&pre[j]<pre[root])j--;
}
if(i-j!=1)return;
getPost(root+1,j);//左子树
getPost(i,tail); //右子树
post.push_back(pre[root]);
}
int main(int argc,char * argv[]) {
int n,m;
scanf("%d",&n);
for(int i=0; i<n; i++) {
scanf("%d",&m);
pre.push_back(m);
}
getPost(0,n-1);
if(post.size()!=n) {
isMirror=true;
post.clear();
getPost(0,n-1);
}
if(post.size()==n) {
printf("YES\n%d",post[0]);
for(int i=1; i<post.size(); i++) {
printf(" %d",post[i]);
}
} else {
printf("NO\n");
}
return 0;
}

PAT Advanced 1043 Is It a Binary Search Tree (25) [⼆叉查找树BST]的更多相关文章

  1. PAT Advanced 1099 Build A Binary Search Tree (30) [⼆叉查找树BST]

    题目 A Binary Search Tree (BST) is recursively defined as a binary tree which has the following proper ...

  2. PAT Advanced 1064 Complete Binary Search Tree (30) [⼆叉查找树BST]

    题目 A Binary Search Tree (BST) is recursively defined as a binary tree which has the following proper ...

  3. PAT 甲级 1043 Is It a Binary Search Tree (25 分)(链表建树前序后序遍历)*不会用链表建树 *看不懂题

    1043 Is It a Binary Search Tree (25 分)   A Binary Search Tree (BST) is recursively defined as a bina ...

  4. 【PAT】1043 Is It a Binary Search Tree(25 分)

    1043 Is It a Binary Search Tree(25 分) A Binary Search Tree (BST) is recursively defined as a binary ...

  5. PAT 甲级 1043 Is It a Binary Search Tree

    https://pintia.cn/problem-sets/994805342720868352/problems/994805440976633856 A Binary Search Tree ( ...

  6. 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 proper ...

  7. 1043 Is It a Binary Search Tree (25分)(树的插入)

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

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

    简单题.构造出二叉搜索树,然后check一下. #include<stdio.h> #include<algorithm> using namespace std; +; st ...

  9. PAT (Advanced Level) 1099. Build A Binary Search Tree (30)

    预处理每个节点左子树有多少个点. 然后确定值得时候递归下去就可以了. #include<cstdio> #include<cstring> #include<cmath& ...

随机推荐

  1. 反射①:如何获取class对象六种方法

    获取class对象的六种方法 了解:class类——是Java反射机制的入口,封装了一个类或接口的运行信息,通过调用Class类的方法可以获取这些信息,其特点如下: 1.该类在java.lang包中: ...

  2. Nature

    1.主干 (1)<河图+洛书>:启发伏羲作八卦. (2)<三坟+五典>:失传:伏羲.神农.轩辕.少昊.颛顼.帝喾.唐尧.虞舜. (3)<八索+九丘>:失传:八卦之书 ...

  3. 【LeetCode】226. 翻转二叉树

    题目 翻转一棵二叉树. 示例: 输入: 4 / \ 2 7 / \ / \ 1 3 6 9 输出: 4 / \ 7 2 / \ / \ 9 6 3 1 本题同[剑指Offer]面试题27. 二叉树的镜 ...

  4. UVA - 10382 Watering Grass(几何)

    题意:有一个矩形,n个圆.已知矩形的长宽和圆的半径,问最少需多少个圆将矩形完全覆盖. 分析: 1.首先求圆与矩形的长的交点,若无交点,则一定不能对用最少的圆覆盖矩形有贡献. 2.如果两个圆与矩形相交所 ...

  5. 九十三、SAP中ALV事件之七,对自己定义的工具栏进行添加和删改

    一.我们来到工具栏页面,如果不想要某个工具栏,删掉相应的文字再双击空白就可以了 二.我们添加一个工具栏,如ZADD,双击文字 三.保存静态文本,会弹出一个功能文本框 四.填写相应的内容后,点击对勾保存 ...

  6. 050-PHP除法运算

    <?php $n=10/3; //除法运算 echo $n; //输出变量n的值 ?>

  7. Spark 内存管理

    Spark 内存管理 Spark 执行应用程序时, 会启动 Driver 和 Executor 两种 JVM 进程 Driver 负责创建 SparkContext 上下文, 提交任务, task的分 ...

  8. 【剑指Offer】面试题13. 机器人的运动范围

    题目 地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] .一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左.右.上.下移动一格(不能移动到方格外),也不能进入行坐 ...

  9. C语言-存储类&作用域&生命周期&链接属性

    1.概念解析(1)存储类 a.存储类就是存储类型,也就是描述C语言变量在何种地方存储. b.内存有多种管理办法:栈.堆.数据段.bss段..text段......一个变量的存储类属性就是描述这个变量存 ...

  10. C++编程学习(一) 概述

    从一年前开通博客,陆陆续续写了一些总结类的东西,但是一直没push到网上.现在发现,分享自己的笔记也是自身学习.与他人交流的好方式.从今天开始,我会经常的push一些学习笔记到博客中,先从C++开始吧 ...