A1043 Is It a Binary Search Tree (25分)

Posted tsruixi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了A1043 Is It a Binary Search Tree (25分)相关的知识,希望对你有一定的参考价值。

一、技术总结

  1. 这一题是二叉排序树的问题,题目主要是给出二叉排序树的先序遍历或者二叉排序树镜像的先序遍历或其他,如果是前两种输出YES,并且输出各自的后序遍历。后者直接输出NO
  2. 关键在于创建树,据我观察发现无论是镜像的先序遍历还是原来二叉排序树的先序遍历,可以直接根据二叉排序树的特点进行树的创建。用inset函数,创建出来都是二叉排序树,没有镜像与不镜像之分。到了这一步,只需处理如何将这个标准的二叉排序树,变成镜像的先序遍历,其实只要将左右子树递归的顺序换一下即可。详细参考代码。
  3. 然后就是将其进行比较匹配,输出。

二、参考代码

#include<bits/stdc++.h>
using namespace std;
struct node{
    int data;
    node *lchild, *rchild;
};
void insert(node* &root, int data){
    if(root == NULL){
        root = new node;
        root->data = data;
        root->lchild = root->rchild = NULL;//这句不能够漏掉 
        return;
    }
    if(data < root->data) insert(root->lchild, data);
    else insert(root->rchild, data);
}
//先序遍历结果存于vi 
void preOrder(node* root, vector<int> &vi){
    if(root == NULL) return;
    vi.push_back(root->data);
    preOrder(root->lchild, vi);
    preOrder(root->rchild, vi); 
}
//镜像树的先序遍历,结果存放于vi
void preOrderMirror(node* root, vector<int> &vi){
    if(root == NULL) return;
    vi.push_back(root->data);
    preOrderMirror(root->rchild, vi);
    preOrderMirror(root->lchild, vi);
} 
//后序遍历结果存于vi 
void postOrder(node* root, vector<int> &vi){
    if(root == NULL) return;
    postOrder(root->lchild, vi);
    postOrder(root->rchild, vi);
    vi.push_back(root->data);
}
//镜像树的后序遍历,结果存放于vi
void postOrderMirror(node* root, vector<int> &vi){
    if(root == NULL) return;
    postOrderMirror(root->rchild, vi);
    postOrderMirror(root->lchild, vi);
    vi.push_back(root->data);
} 
vector<int> origin, pre, preM, post, postM;
int main(){
    int n, data;
    node* root = NULL;
    scanf("%d", &n);
    for(int i = 0; i < n; i++){
        scanf("%d", &data);
        origin.push_back(data);
        insert(root, data);
    }
    preOrder(root, pre);
    preOrderMirror(root, preM);
    postOrder(root, post);
    postOrderMirror(root, postM);
    if(origin == pre){
        printf("YES
");
        for(int i = 0; i < n; i++){
            if(i != 0) printf(" ");
            printf("%d", post[i]);
        }
    }else if(origin == preM){
        printf("YES
");
        for(int i = 0; i < n; i++){
            if(i != 0) printf(" ");
            printf("%d", postM[i]);
        }       
    }else{
        printf("NO
"); 
    }
    return 0;
} 

以上是关于A1043 Is It a Binary Search Tree (25分)的主要内容,如果未能解决你的问题,请参考以下文章

1043 Is It a Binary Search Tree

1043 Is It a Binary Search Tree

1043. Is It a Binary Search Tree (25)

1043. Is It a Binary Search Tree (25)

PAT1043 Is It a Binary Search Tree

1043 Is It a Binary Search Tree (25 分)