• L2-004. 这是二叉搜索树吗?


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

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

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

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

    输入格式:

    输入的第一行给出正整数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
    

    根据给出的前序或镜像前序,再根据二叉搜索树的性质,可以得到后序遍历,加入符合条件,后序遍历数组大小应该为n,否则小于n。

    代码:

    #include <iostream>
    #include <cstring>
    
    using namespace std;
    int m[1000],num,post[1000];
    void getpost(int l,int r,int flag)//寻找后序   l为根r为最右断 flag代表不同的选择 0 为前序,1为镜像前序
    {
        int ll = l + 1,rr = r;
        if(!flag)前序遍历是按照 根 左子树(键值全部小于根) 右子树(键值全部大于等于根) 的顺序排列的
        {
            while(ll <= r && m[ll] < m[l])ll ++;
            while(l < rr && m[rr] >= m[l])rr --;
        }
        else //镜像前序遍历是按照 根 右子树(键值全部大于等于根) 左子树(键值全部小于根) 的顺序排列的
        {
            while(ll <= r && m[ll] >= m[l])ll ++;
            while(l < rr && m[rr] < m[l])rr --;
        }
        if(ll - rr == 1)//如果是正常的  ll肯定会多前进一个位置,rr会多前进一个位置 
        {
            getpost(l + 1,rr,flag);//左子树
            getpost(ll,r,flag);//右子树
        }
        else return; //不满足就直接反回
        post[num ++] = m[l];//放在最后  形成的才是后序遍历
    }
    int main()
    {
        int n;
        cin>>n;
        for(int i = 0;i < n;i ++)
        {
            cin>>m[i];
        }
        getpost(0,n-1,0);
        if(num != n)
        {
            num = 0;
            getpost(0,n-1,1);
        }
        if(num != n)cout<<"NO";
        else
        {
            cout<<"YES"<<endl;
            for(int i = 0;i < num;i ++)
            {
                if(i)cout<<' '<<post[i];
                else cout<<post[i];
            }
        }
    }
  • 相关阅读:
    高级性能测试工程师进阶系列课程
    LoadRunner补丁Patch4下载
    【广州】LoadRunner性能测试实战训练
    LoadRunner测试国产神通数据库的方法
    深圳 LoadRunner性能测试技术培训
    高级软件测试工程师系列课程
    《.NET性能测试诊断与优化》教程
    《ASP.NET Site Performance Secrets》读书笔记
    AppDynamics监控JBOSS
    为企业免费提供性能测试指导(每月仅一个名额)
  • 原文地址:https://www.cnblogs.com/8023spz/p/7815518.html
Copyright © 2020-2023  润新知