zoukankan      html  css  js  c++  java
  • 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
    

     二叉搜索树前序第一个是根,然后是左子树都比根小,右子树都大于等于根。我们可以用dfs求出二叉树。如果二叉树长度与给定总长度不相等就输出NO,不符合要求。

    #include <algorithm>
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <vector>
    #define debug(a) cout << #a << " " << a << endl
    using namespace std;
    typedef long long ll;
    vector<int> pre;
    vector<int> post;
    int isMirror;
    void dfs( int root, int tail ) {
        if( root > tail ) {
            return ;
        }
        int i = root + 1, j = tail;
        if( !isMirror ) { //非镜像的情况下,从最后一个开始往前面找第一个小的就是左子树的边界,右子树类似,镜像类似
            while( i <= tail && pre[root] > pre[i] ) {
                i ++;
            }
            while( j > root && pre[root] <= pre[j] ) {
                j --;
            }
        } else {
            while( i <= tail && pre[root] <= pre[i] ) {
                i ++;
            }
            while( j > root && pre[root] > pre[j] ) {
                j --;
            }
        }
        if( i - j != 1 ) {
            return ;
        }
        dfs( root + 1, j );
        dfs( i, tail );
        post.push_back( pre[root] );
    }
    int main() {
        int n;
        cin >> n;
        //pre.resize(n); // 开始分配空间就可以直接用下标调用
        for( int i = 0; i < n; i ++ ) {
            int t;
            cin >> t;
            pre.push_back(t);
        }
        dfs( 0, n - 1 );
        if( post.size() != n ) {
            isMirror = true;
            post.clear();
            dfs( 0, n - 1 );
        }
        if( post.size() == n ) {
            cout << "YES" << endl << post[0];
            for( int i = 1; i < n; i ++ ) {
                cout << " " << post[i];
            }
        } else {
            cout << "NO" << endl;
        }
        return 0;
    }
    彼时当年少,莫负好时光。
  • 相关阅读:
    problems_jenkins
    JAVA异常处理之finally中最好不要使用return
    IntelliJ idea学习资源
    Mybatis 的分页条件查询语句编写
    maven相关的学习资料
    git相关的学习资料
    开端三(1)
    开端2(2)
    C# 排序小测试
    想为一个类定义[][]方法
  • 原文地址:https://www.cnblogs.com/l609929321/p/8486086.html
Copyright © 2011-2022 走看看