PAT--1043 Is It a Binary Search Tree(二叉排序树的建立与判定)

思路:
如何判断一个输入序列是否是一颗二叉排序树的前序序列或者是其镜像树的前序序列?
方法一:根据输入序列建立一颗二叉排序树和一颗镜像树,分别再进行前序遍历,若这两棵树中,有一个前序序列和输入序列相同,则输出yes。否则输出no。vector可以用==判断是否相等,故数据的存放用vector来存储。
参考博客: https://blog.csdn.net/xianyun2009/article/details/50191137
方法二:还有一个规律是镜像树的后序遍历与其二叉排序树的前序遍历的逆序相同,镜像树的前序遍历与其二叉排序树的后序遍历的逆序相同。对于一颗二叉树来说,其后序遍历是左右根,故其镜像树的前序遍历序列为其后序遍历的逆序也就是根右左。因此可以按照二叉排序树的规则只建立一棵树,之后用根右左的遍历规则得到其镜像树的前序遍历序列。网上也有人用这种方法做。
我用方法一来做。

#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>

using namespace std;

struct Node
{
    Node *lchild, *rchild;
    int num;
};

vector<int> inpVec, preVec, mipreVec, postVec;

Node* create(int v)
{
    Node *root = new Node();
    root->lchild = root->rchild = NULL;
    root->num = v;
    return root;
}

//建立一颗二叉排序树
Node* insert1(Node *root, int v)
{
    if (root == NULL)
        return create(v);
    else
    {
        if (v < root->num)
            root->lchild = insert1(root->lchild, v);
        else
            root->rchild = insert1(root->rchild, v);
    }
    return root;
}
//建立一颗镜像树
Node* insert2(Node *root, int v)
{
    if (root == NULL)
        return create(v);
    else
    {
        if (v >= root->num)
            root->lchild = insert2(root->lchild, v);
        else
            root->rchild = insert2(root->rchild, v);
    }
    return root;
}

//前序遍历
void preOrder(Node* root, vector<int> &vec)
{
    vec.push_back(root->num);
    if (root->lchild)
        preOrder(root->lchild, vec);
    if (root->rchild)
        preOrder(root->rchild, vec);
}

//后序遍历
void postOrder(Node* root, vector<int> &vec)
{
    if (root->lchild)
        postOrder(root->lchild, vec);
    if (root->rchild)
        postOrder(root->rchild, vec);
    vec.push_back(root->num);
}

int main()
{
    int n, k;
    scanf("%d", &n);
    Node *root1 = NULL, *root2 = NULL;
    for (int i = 0; i < n; ++i)
    {
        scanf("%d", &k);
        inpVec.push_back(k);    //保存输入序列
        root1 = insert1(root1, k);
        root2 = insert2(root2, k);
    }

    //分别保存二叉树和镜像树的前序遍历序列
    preOrder(root1, preVec);    
    preOrder(root2, mipreVec);

    if(inpVec == preVec)
    {
        printf("YES\n");
        postOrder(root1, postVec);
        for(int i = 0; i < postVec.size(); ++i)
        {
            if(i == postVec.size()-1)
                printf("%d\n", postVec[i]);
            else
                printf("%d ", postVec[i]);
        }
    }
    else if(inpVec == mipreVec)
    {
        printf("YES\n");
        postOrder(root2, postVec);
        for(int i = 0; i < postVec.size(); ++i)
        {
            if(i == postVec.size()-1)
                printf("%d\n", postVec[i]);
            else
                printf("%d ", postVec[i]);
        }
    }
    else
        printf("NO\n");

    return 0;
}

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看rEADME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值