PAT Advanced 1043 Is It a Binary Search Tree (25分)

时间:2020-01-23 00:30:27   收藏:0   阅读:113

A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties:

If we swap the left and right subtrees of every node, then the resulting tree is called the Mirror Image of a BST.

Now given a sequence of integer keys, you are supposed to tell if it is the preorder traversal sequence of a BST or the mirror image of a BST.

Input Specification:

Each input file contains one test case. For each case, the first line contains a positive integer N (≤). Then N integer keys are given in the next line. All the numbers in a line are separated by a space.

Output Specification:

For each test case, first print in a line YES if the sequence is the preorder traversal sequence of a BST or the mirror image of a BST, or NO if not. Then if the answer is YES, print in the next line the postorder traversal sequence of that tree. All the numbers in a line must be separated by a space, and there must be no extra space at the end of the line.

Sample Input 1:

7
8 6 5 7 10 8 11
 

Sample Output 1:

YES
5 7 6 8 11 10 8
 

Sample Input 2:

7
8 10 11 8 6 7 5
 

Sample Output 2:

YES
11 8 10 7 5 6 8
 

Sample Input 3:

7
8 6 8 5 10 9 11
 

Sample Output 3:

NO

这道题目考察了二叉排序树。二叉排序树一个性质,已知先序就可以求后序。

1.我们可以直接使用sort进行排序,然后根据先序中序求后序。

2.我们可以用i,j进行把二叉树划分2个子树,进行递归求解。(参考柳神)

#include <iostream>
#include <vector>
using namespace std;
int N;
bool mirror = false;
vector<int> pre, post;
void getPost(int root, int tail){
    if(root > tail) return ;
    int i = root + 1, j = tail;
    if(!mirror) {
        while(i <= tail && pre[i] < pre[root]) i++;//右子树最小的
        while(j > root && pre[j] >= pre[root]) j--;//左子树最大的
    }else {
        while(i <= tail && pre[i] >= pre[root]) i++;//右子树最小的
        while(j > root && pre[j] < pre[root]) j--;//左子树最大的
    }
    if(i - j != 1) return ; // 此时相差必为1, 否则不符合
    getPost(root + 1, j);
    getPost(i, tail);
    post.push_back(pre[root]);
}
int main() {
    cin >> N;
    pre.resize(N);
    for(int i = 0; i < N; i++)
        cin >> pre[i];
    getPost(0, N-1);
    if(post.size() != N) {
        post.clear();
        mirror = true;
        getPost(0, N-1);
    }
    if(post.size() != N) cout << "NO";
    else {
        cout << "YES" << endl;
        for(int i = 0; i < N; i++)
            if(i != N-1) cout << post[i] <<" ";
            else cout << post[i];
    }
    system("pause");
    return 0;
}

原文:https://www.cnblogs.com/littlepage/p/12230017.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!