L2-004 这是二叉搜索树吗? (25 分)(数组模拟)

简介: L2-004 这是二叉搜索树吗? (25 分)(数组模拟)

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


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


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


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


输入格式:

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


输出格式:

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


输入样例 1:

1. 7
2. 8 6 5 7 10 8 11

结尾无空行


输出样例 1:

1. YES
2. 5 7 6 8 11 10 8

结尾无空行


输入样例 2:

1. 7
2. 8 10 11 8 6 7 5

结尾无空行


输出样例 2:

1. YES
2. 11 8 10 7 5 6 8

结尾无空行


输入样例 3:

1. 7
2. 8 6 8 5 10 9 11

结尾无空行


输出样例 3:

NO

结尾无空行


思路:如果一颗二叉树的前序是符合规则的,那么他一定有一个与之对应的后序序列 ,按照题意模拟一下就行了

#include<iostream>
#include<vector>
using namespace std;
const int N=1010;
int a[N],n,t;
vector<int>post;
void get_post(int l,int r)
{
    int i=l+1,j=r;
    if(l>r) return ;
    if(!t)//反转前
    {
        while(i<=r&&a[i]<a[l]) i++;
        while(j>l&&a[j]>=a[l]) j--;
    }
    else//反转后
    {
        while(i<=r&&a[i]>=a[l]) i++;
        while(j>l&&a[j]<a[l]) j--;
    }
    if(i-j!=1) return ;
    get_post(l+1,j);
    get_post(i,r);
    post.push_back(a[l]);//后序
}
int main()
{
    cin>>n;
    for(int i=0;i<n;i++) cin>>a[i];
    get_post(0,n-1);
    if(post.size()!=n)//后序是否存在
    {
        t=1;//标记,令左右子树反转
        post.clear();//清空
        get_post(0,n-1);
    }
    if(post.size()==n)//满足
    {
        cout<<"YES\n";
        for(int i=0;i<post.size();i++)
        {
            if(i) cout<<' ';
            cout<<post[i];
        }
    }
    else cout<<"NO\n";
    return 0;
}


目录
相关文章
|
9月前
|
Java
如何实现一个高效的二叉搜索树(BST)?请给出时间复杂度分析。 要求:设计一个二叉搜索树,支持插入、删除和查找操作。要求在平均情况下,这些操作的时间复杂度为O(log n)。同时,考虑树的平衡性,使得树的高度保持在对数级别。
如何实现一个高效的二叉搜索树(BST)?请给出时间复杂度分析。 要求:设计一个二叉搜索树,支持插入、删除和查找操作。要求在平均情况下,这些操作的时间复杂度为O(log n)。同时,考虑树的平衡性,使得树的高度保持在对数级别。
78 0
|
6月前
|
C++
给出一个数据序列,建立二叉排序树,并实现插入功能 对二叉排序树进行中序遍历,可以得到有序的数据序列
该文章通过C++代码示例讲解了如何根据输入数据序列构建二叉排序树,并实现插入功能,随后通过中序遍历输出有序的数据序列,展示了对二叉排序树进行操作和遍历的完整过程。
|
9月前
|
搜索推荐 算法 索引
【排序算法】深入解析快速排序(霍尔法&&三指针法&&挖坑法&&优化随机选key&&中位数法&&小区间法&&非递归版本)
【排序算法】深入解析快速排序(霍尔法&&三指针法&&挖坑法&&优化随机选key&&中位数法&&小区间法&&非递归版本)
224 4
|
9月前
|
搜索推荐 算法
在冒泡排序算法中,为什么每次比较相邻的元素时都要进行交换?
【2月更文挑战第8天】【2月更文挑战第21篇】在冒泡排序算法中,为什么每次比较相邻的元素时都要进行交换?
62 1
|
9月前
|
算法 测试技术 C#
【动态规划】【数论】【区间合并】3041. 修改数组后最大化数组中的连续元素数目
【动态规划】【数论】【区间合并】3041. 修改数组后最大化数组中的连续元素数目
|
9月前
|
Java
每日一题《剑指offer》数组篇之调整数组顺序使奇数位于偶数前面
每日一题《剑指offer》数组篇之调整数组顺序使奇数位于偶数前面
72 0
每日一题《剑指offer》数组篇之调整数组顺序使奇数位于偶数前面
|
算法
减治法实现插入排序,减治法实现二叉查找树(二叉搜索数,二叉排序数)的创建、插入与查找(含解析与代码实现)
减治法实现插入排序,减治法实现二叉查找树(二叉搜索数,二叉排序数)的创建、插入与查找(含解析与代码实现)
127 0
【CCCC】L3-016 二叉搜索树的结构 (30分),,手动建堆(二叉搜索树节点询问),map写法
【CCCC】L3-016 二叉搜索树的结构 (30分),,手动建堆(二叉搜索树节点询问),map写法
123 0
由遍历序列构造二叉树--王道
前序遍历 + 中序遍历序列 后序+中序遍历序列 层序遍历+中序遍历序列
307 0
由遍历序列构造二叉树--王道
L3-010 是否完全二叉搜索树 (30 分)(数组模拟)
L3-010 是否完全二叉搜索树 (30 分)(数组模拟)
103 0