对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值。如果我们交换每个节点的左子树和右子树,得到的树叫做镜像二叉搜索树。

现在我们给出一个整数键值序列,请编写程序判断该序列是否为某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,如果是,则输出对应二叉树的后序遍历序列。

输入格式:
输入的第一行包含一个正整数N(≤1000),第二行包含N个整数,为给出的整数键值序列,数字间以空格分隔。

输出格式:
输出的第一行首先给出判断结果,如果输入的序列是某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,则输出YES,否侧输出NO。如果判断结果是YES,下一行输出对应二叉树的后序遍历序列。数字间以空格分隔,但行尾不能有多余的空格。

输入样例1:

7
8 6 5 7 10 8 11

输出样例1:

YES
5 7 6 8 11 10 8

输入样例2:

7
8 6 8 5 10 9 11

输出样例2:

NO

**思路:**这道题的关键是掌握构造BST平衡二叉树的算法,也就是如果向一个BST种插入节点。注意看代码种insert函数的写法。

#include<iostream>
#include<vector>using namespace std;struct node{int data;node * l;node * r;
};void insert(node * &BST,int x);void DLR(node *B, vector<int>&pre);
void DLR_mirror(node *B, vector<int> &pre_mirror);
void LRD(node *B, vector<int> &post);
void LRD_mirror(node *B, vector<int> &post_mirror);int main(){int n;vector<int> initial;node * B = NULL;cin >> n;for(int i = 0; i < n; i++){int t;cin >> t;initial.push_back(t);insert(B,t);}vector <int> pre,pre_mirror,post,post_mirror;DLR(B,pre);DLR_mirror(B,pre_mirror);LRD(B,post);LRD_mirror(B,post_mirror);if(initial == pre || initial == pre_mirror){cout << "YES" << endl;if(initial == pre){for(int i = 0; i < post.size(); i++){if(i)cout<< " ";cout << post[i];}}else{for(int i = 0; i < post_mirror.size(); i++){if(i) cout <<" ";cout << post_mirror[i]; }}}else{cout <<"NO"; }return 0;
}void insert(node * &B, int x){if(B==NULL){B = new node;B->data = x;B->l = NULL;B->r = NULL;return;}if(x < B->data){insert(B->l,x);}else{insert(B->r,x);}}void DLR(node *B, vector<int>&pre){if(B){pre.push_back(B->data);DLR(B->l,pre);DLR(B->r,pre);}
}void DLR_mirror(node *B, vector<int> &pre_mirror){if(B){pre_mirror.push_back(B->data);DLR_mirror(B->r,pre_mirror);DLR_mirror(B->l,pre_mirror);}
}void LRD(node *B, vector<int> &post){if(B){LRD(B->l,post);LRD(B->r, post);post.push_back(B->data);}
}
void LRD_mirror(node *B, vector<int> &post_mirror){if(B){LRD_mirror(B->r,post_mirror);LRD_mirror(B->l, post_mirror);post_mirror.push_back(B->data);}
}

L2-004 搜索树判断 (25 point(s))相关推荐

  1. 7-28 搜索树判断 (25 分)(思路加详解) just easy!

    一:题目 对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值.如果我们交换每个节点的左子树和右子树,得到的树叫做镜像二叉搜索树. 现在我们给出一个 ...

  2. 7-2 搜索树判断 (25 分)

    大一下半期数据结构 搜索树判断 对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值.如果我们交换每个节点的左子树和右子树,得到的树叫做镜像二叉搜索 ...

  3. 7-42 关于堆的判断 (25 分)

    7-42 关于堆的判断 (25 分) 将一系列给定数字顺序插入一个初始为空的小顶堆H[].随后判断一系列相关命题是否为真.命题分下列几种: x is the root:x是根结点: x and y a ...

  4. 【CCCC】L2-012 关于堆的判断 (25分),,手写堆,二叉树编号,向上调整

    problem L2-012 关于堆的判断 (25分) 将一系列给定数字顺序插入一个初始为空的小顶堆H[].随后判断一系列相关命题是否为真.命题分下列几种: x is the root:x是根结点: ...

  5. l2-004 这是二叉搜索树吗? (25分)_什么是 “线段树” ?

    线段树是一个复杂的数据结构,比较难理解,也比较难解释清楚.在我将这个数据结构反复学习了五遍的时候,我终于有了信心写出这篇介绍线段树的文章.希望大家能够掌握这种数据结构. 这篇文章比较长,建议大家耐心阅 ...

  6. 04-树4 是否同一棵二叉搜索树 (25 分)

    给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果 ...

  7. 7-1 是否同一棵二叉搜索树 (25 分)

    大一下半期数据结构 是否同一棵二叉搜索树 给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和{2, 3, 1} ...

  8. 6-2 是否二叉搜索树 (25 分)

    大一下半期数据结构 是否二叉搜索树 本题要求实现函数,判断给定二叉树是否二叉搜索树. 函数接口定义: bool IsBST ( BinTree T ); 其中BinTree结构定义如下: typede ...

  9. 【解析】基础实验4-2.5 关于堆的判断 (25 分)

    立志用最少的代码做最高效的表达 将一系列给定数字顺序插入一个初始为空的小顶堆H[].随后判断一系列相关命题是否为真.命题分下列几种: x is the root:x是根结点: x and y are ...

  10. 关于堆的判断 (25 分)

    题目: 将一系列给定数字顺序插入一个初始为空的小顶堆H[].随后判断一系列相关命题是否为真.命题分下列几种: x is the root:x是根结点: x and y are siblings:x和y ...

最新文章

  1. Microbiome:植物根际微生物组也有昼夜节律
  2. Use Excel Pivot Table as a BI tool
  3. java isempty_Optional.isEmpty()即将加入Java吗?
  4. [Nowcoder] 大整数相乘(拼多多笔试题)
  5. 【MySQL】MySQL 使用where条件的三种方式
  6. 大网的经验(华为的创新—转载)
  7. Java知识积累——同时输出到控制台和指定文件,或直接输出到指定文件
  8. html%3c转译,[转]URL编码
  9. CentOS忘记root登录密码
  10. gitee 企业 git clone You hasn‘t joined this enterprise! 问题
  11. 全面解读“资金二清”与“信息二清”
  12. 谈谈写程序与学英语 --宋劲杉
  13. OPENGL回归原点
  14. note3+android+5.1,最新的安卓5.1.1 ROOT教程(不需要刷第三方内核)
  15. 一个在线测试正则表达式的网站推荐
  16. 软考中级-结构化开发
  17. 十四、51单片机之AD转换
  18. Tiny4412裸机程序之代码重定位初体验
  19. 湛江C语言培训,湛江c语言编程学习,湛江学c语言编程报班,湛江学c语言编程自学好还是报班好...
  20. 智能android电视更换播放器,GitHub - xioxu/TvPlayer: android智能电视播放器,可以播放各电视台节目,播放基于ijkplayer的实现。...

热门文章

  1. 【转】请不要做浮躁的人。
  2. C# 最简单的异步委托
  3. EmEditor中,正则判断行中是否存在自动字符串
  4. Ubuntu:conda的安装与使用
  5. 【翻译】New Lane Model and Distance Transform for Lane Detection and Tracking
  6. java自带数据结构(set/list/stack/queue)
  7. 在Windows上安装jupyter notebook的scala kernel —— jupyter-scala
  8. vue实例中使用swiper
  9. Android-LayoutParams的那些事
  10. 了解Spring AOP吗