• 天梯 L2 这是二叉搜索树吗?


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

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

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

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

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

    输入格式:

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

    输出格式:

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

    输入样例 1:

    7
    8 6 5 7 10 8 11
    

    输出样例 1:

    YES
    5 7 6 8 11 10 8
    

    输入样例 2:

    7
    8 10 11 8 6 7 5
    

    输出样例 2:

    YES
    11 8 10 7 5 6 8
    

    输入样例 3:

    7
    8 6 8 5 10 9 11
    

    输出样例 3:

    NO



    解题思路:
      先根据题目要求判断该序列是否是二叉搜索树或其镜像进行前序遍历的结果:
      判断[l,r]范围是否前一部分均小于a[l],剩下的均大于等于a[l] 或相反。
      在判断的过程中我们可以得到这棵树的左子树、右子树和根,所以我们只需在判断的过程中将其按后序遍历的顺序存下来即可。
    #include<bits/stdc++.h>
    #define ll long long
    #define exp 1e-8
    using namespace std;
    const int N = 1000+5;
    const int INF = 0x3f3f3f3f;
    int a[N];
    vector<int> rt;
    void judge(int l,int r,int f){
        if (l==r) {
            rt.push_back(a[l]);
            return ;
        }
        int l1=l+1,r1=r;
        if (!f){
            while(l1<=r&&a[l1]<a[l]) l1++;
            while(r1>l&&a[r1]>=a[l]) r1--;
        }else {
            while(l1<=r&&a[l1]>=a[l]) l1++;
            while(r1>l&&a[r1]<a[l]) r1--;
        }
        if (l1-r1!=1) return ;
        judge(l+1,r1,f);
        judge(l1,r,f);
        rt.push_back(a[l]);
    
    }
    int main(){
        int n;
        scanf("%d",&n);
        for (int i=0;i<n;i++) scanf("%d",&a[i]);
        judge(0,n-1,0);
        if (rt.size()==n) {
            printf("YES
    %d",rt[0]);
            for (int i=1;i<n;i++)
                printf(" %d",rt[i]);
        }else {
            rt.clear();
            judge(0,n-1,1);
            if (rt.size()==n) {
                printf("YES
    %d",rt[0]);
                for (int i=1;i<n;i++)
                    printf(" %d",rt[i]);
            }else printf("NO
    ");
        }
        return 0;
    }
    View Code
     
  • 相关阅读:
    IE7下元素的 'paddingtop' 遇到 'clear' 特性在某些情况下复制到 'paddingbottom'
    Foundation HTML5 Canvas中的2处错误
    近期学习技术安排
    2011年工作总结和展望(上篇)
    详解ObjectiveC消息传递机制
    ObjectiveC 2.0的运行时编程消息转发
    c# Pdf 转换图片
    c语言指针用法难点
    C# web实现word 转Html、office转Html、pdf转图片 在线预览文件
    ObjectiveC中什么是类
  • 原文地址:https://www.cnblogs.com/l999q/p/10490416.html
Copyright © 2020-2023  润新知