pat-A1043:Is it a Binary Search Tree(二叉搜索树和及其镜像树的遍历)

版权声明:转载请注明出处哦~ https://blog.csdn.net/Cassie_zkq/article/details/83020461

目录

题目解释:

解题思路:

ac代码:

题目地址:https://pintia.cn/problem-sets/994805342720868352/problems/994805440976633856

题目解释:


给出一个二叉树的序列,判断它是否是“二叉搜索树(BST)”或者“二叉搜索树的镜像树”的先序序列。

是的话输出YES和该树的后序序列,否输出NO。

所谓镜像树就是把BST的每个结点的左右子树交换位置,也就是对于原二叉树来说,向下遍历时要先遍历每个结点的右子树再遍历该结点的左子树,这样遍历出来的序列就是镜像树的先序序列。

解题思路:


将输入的序列建BST树,再按分别按BST和the mirror of BST的先序遍历和后序遍历方法遍历已建好的树,比较题目给出的序列时哪种树的先序序列,再输出该树的后序序列。

注意:将先序和后序遍历的结果用四个vector存,再直接判相等关系,若是用数组存的话,那么判断相等关系时需要用到循环,比较费时。

vector为变长数组,比较节省空间

对于vector中存的时内置类型的数据,如int,char,因为vector已经重载了“==”   、“!=”、  “<=”、 “>=”、 “<”、 “>”运算符,所以可以直接将两个vector用这些运算符比较。

详情参考:https://www.jianshu.com/p/51225ce0b234

ac代码:


#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
struct node{
    int data;
    node *left,*right;
};
void insert(node *&root,int data)
{
    if(root==NULL)//插入位置
    {
        root=new node;
        root->data=data;
        root->left=root->right=NULL;
        return ;
    }
    if(data<root->data) insert(root->left,data);
    else insert(root->right,data);
}
void preorder(node *root,vector<int> &a)
{
    if(root==NULL) return ;
    a.push_back(root->data);
    preorder(root->left,a);
    preorder(root->right,a);
}
void preordermirror(node *root,vector<int> &a)//镜像树遍历右子树,再遍历左子树
{
    if(root==NULL) return ;
    a.push_back(root->data);
    preordermirror(root->right,a);
    preordermirror(root->left,a);
}
void postorder(node *root,vector<int> &a)
{
    if(root==NULL) return ;
    postorder(root->left,a);
    postorder(root->right,a);
    a.push_back(root->data);
}
void postordermirror(node *root,vector<int> &a)
{
    if(root==NULL) return ;
    postordermirror(root->right,a);
    postordermirror(root->left,a);
    a.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\n");
        for(int i=0;i<post.size();i++)
        {
            printf("%d",post[i]);
            if(i<post.size()-1) printf(" ");
        }
    }
    else if(origin==prem)//初始序列等于镜像树先序序列
    {
        printf("YES\n");
        for(int i=0;i<postm.size();i++)
        {
            printf("%d",postm[i]);
            if(i<postm.size()-1) printf(" ");
        }
    }
    else printf("NO\n");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Cassie_zkq/article/details/83020461