1043 Is It a Binary Search Tree C++

分析

以二叉排序树的前序序列为输入序列,重新构成的二叉排序树和原二叉排序树相同,因此,判断输入序列的是否是某一棵二叉排序树的前序序列,只需要判断用输入序列构成的二叉排序树的前序序列是否和输入序列相同即可。

//
// Created by CyIce on 2021/1/12.
//

#include <stdio.h>
#include <vector>

using namespace std;
const int MAXN = 1000;
int N, inputList[MAXN];
//二叉树后序和前序序列
vector<int> postList, preList;

//二叉树节点信息
struct node {
    int data;
    node *left, *right;
};

//新建节点
node *newNode(int x) {
    node *Node = new node;
    Node->data = x;
    Node->left = Node->right = NULL;
    return Node;
}

//插入节点
void insert(node *&node, int x) {
    if (node == NULL) {
        node = newNode(x);
        return;
    }
    if (node->data <= x)
        insert(node->right, x);
    else
        insert(node->left, x);
}

//镜向翻转二叉树
void mirror(node *&tree) {
    if (tree == NULL)
        return;
    else {
        node *temp = tree->left;
        tree->left = tree->right;
        tree->right = temp;
        mirror(tree->left);
        mirror(tree->right);
    }
}

//前序遍历
void preTravel(node *tree) {
    if (tree == NULL)
        return;
    preList.push_back(tree->data);
    preTravel(tree->left);
    preTravel(tree->right);
}

//比较输入序列和二叉树的前序遍历序列是否相同
bool checkPreOrder() {
    for (int i = 0; i < N; ++i) {
        if (preList[i] != inputList[i])
            return false;
    }
    return true;
}

//后序遍历
void postTravel(node *tree) {
    if (tree == NULL)
        return;
    postTravel(tree->left);
    postTravel(tree->right);
    postList.push_back(tree->data);

}

int main() {
    scanf("%d", &N);
    node *tree = NULL;
    bool ans1, ans2;
    for (int i = 0; i < N; ++i) {
        scanf("%d", &inputList[i]);
        insert(tree, inputList[i]);
    }
    preTravel(tree);
    ans1 = checkPreOrder();
    if (!ans1) {
        mirror(tree);
        preList.clear();
        preTravel(tree);
    }
    ans2 = checkPreOrder();

    postTravel(tree);

    if (ans1 || ans2) {
        printf("YES\n");
        int i;
        for (i = 0; i < N - 1; ++i) {
            printf("%d ", postList[i]);
        }
        printf("%d\n", postList[i]);
    } else
        printf("NO\n");

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值