7-28 搜索树判断 (25分)
- 数据结构与算法题目集
问题:
对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值。如果我们交换每个节点的左子树和右子树,得到的树叫做镜像二叉搜索树。
现在我们给出一个整数键值序列,请编写程序判断该序列是否为某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,如果是,则输出对应二叉树的后序遍历序列。
输入格式:
输入的第一行包含一个正整数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
思路:
- 有先序序列就可以建立二叉搜索树了 ,先序的第一值总是为根结点
- 如果直接是二叉搜索树 ,那么肯定是满足左小右大
- 如果是镜像二叉搜索树 ,那么满足左大右小
- 所以 ,无论是上面哪种情况 ,我们都应该先确定根结点 ,拿二叉搜索树来说的话 ,就是先找到根结点 ,然后遍历先序序列 ,找到第一个大于根结点的索引值 ,之后的值一定是右子树且一定满足大于根结点 ,若有一个值不满足 ,则说明不是二叉搜索树;镜像二叉树就相反 ,需要找到第一个小于根结点的索引值 ,右边的值均是小于根结点。
- 最后判断到底是二叉搜索树还是镜像二叉搜索树 ,然后后序遍历输出答案
#include<iostream>
#include<stdio.h>
#include<set>
#include<algorithm>
#include<cmath>
#include<map>
#include<vector>
#include<string.h>
#include<stack>
#include<cctype>
#include<map>
#include<queue>
#include<sstream>
using namespace std;
#define inf 0x3f3f3f3f
typedef