zoukankan      html  css  js  c++  java
  • L2004 这是二叉搜索树吗? (25 分)

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

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

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

    所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树。
    给定一个整数键值序列,现请你编写程序,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果。

    输入格式:

    输入的第一行给出正整数 \(N \; (\leq 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
    

    参考代码:

    #include<bits/stdc++.h>
    using namespace std;
    #define maxn 100005
    int n,ans[maxn],cnt;
    bool flag;
    struct it{int val,ls,rs;}so[maxn];
    inline void add(int x,int rt)
    {
        if(so[x].val<so[rt].val)
        {
            if(so[rt].ls)add(x,so[rt].ls);
            else so[rt].ls=x;
        }
        else
        {
            if(so[rt].rs)add(x,so[rt].rs);
            else so[rt].rs=x;
        }
    }
    inline void Dfs1(int rt)
    {
        ans[++cnt]=so[rt].val;
        if(so[rt].ls)Dfs1(so[rt].ls);
        if(so[rt].rs)Dfs1(so[rt].rs);
    }
    inline void Dfs2(int rt)
    {
        ans[++cnt]=so[rt].val;
        if(so[rt].rs)Dfs2(so[rt].rs);
        if(so[rt].ls)Dfs2(so[rt].ls);
    }
    inline void Dfs3(int rt)
    {
        if(so[rt].ls)Dfs3(so[rt].ls);
        if(so[rt].rs)Dfs3(so[rt].rs);
        ans[++cnt]=so[rt].val;
    }
    inline void Dfs4(int rt)
    {
        if(so[rt].rs)Dfs4(so[rt].rs);
        if(so[rt].ls)Dfs4(so[rt].ls);
        ans[++cnt]=so[rt].val;
    }
    int main()
    {
        cin>>n;
        for(int i=1;i<=n;i++)cin>>so[i].val;
        for(int i=2;i<=n;i++)add(i,1);
        Dfs1(1);
        for(int i=1;i<=n;i++)
        {
            if(ans[i]!=so[i].val)break;
            if(i==n)flag=1;
        }
        if(flag)
        {
            cout<<"YES"<<endl;
            cnt=0;
            Dfs3(1);
            for(int i=1;i<=n;i++)cout<<ans[i]<<" \n"[i==n];
            return 0;
        }
        cnt=0;
        Dfs2(1);
        for(int i=1;i<=n;i++)
        {
            if(ans[i]!=so[i].val)break;
            if(i==n)flag=1;
        }
        if(flag)
        {
            cout<<"YES"<<endl;
            cnt=0;
            Dfs4(1);
            for(int i=1;i<=n;i++)cout<<ans[i]<<" \n"[i==n];
            return 0;
        }
        cout<<"NO"<<endl;
        return 0;
    }
    
  • 相关阅读:
    中国的北斗导航授时系统推进5G网络的时间同步
    北斗组网成功,北斗授时(NTP时钟服务器)新风口
    标准化考场时钟同步系统推进智能化校园建设
    智慧医疗分支:医院时钟系统(子母钟系统)
    【京准电子】标准化考场时钟系统方案
    【bWAPP】0X03 HTML Injection
    【bWAPP】0X02 HTML Injection
    【WebGoat】0X00 安装教程
    【bWAPP】0X01 HTML Injection
    【bWAPP】0X00 安装教程
  • 原文地址:https://www.cnblogs.com/LengYun/p/14687728.html
Copyright © 2011-2022 走看看