题意
给出N个正整数来作为一棵二又排序树的结点插入顺序,问:这串序列是否是该二叉排序树的先序序列或是该二叉排序树的镜像树的先序序列。所谓镜像树是指交换二叉树的所有结点的左右子树而形成的树(也即左子树所有结点数据域大于或等于根结点,而根结点数据域小于右子树所有结点的数据域)。如果是镜像树,则输出YES,并输出对应的树的后序序列;否则,输出NO。
思路
通过给定的插入序列,构建出二叉排序树。对镜像树的先序遍历只需要在原树的先序遍历时交换左右子树的访问顺序即可,下面是示例代码:
void preOrder(node *root, vector<int> &v)
{
if (root == NULL)
{
return;
}
v.push_back(root->data);
preOrder(root->left, v);
preOrder(root->right, v);
}
AC代码
#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
/*
origin: 原序列
pre: 先序遍历序列
preM:镜像先序遍历序列
post: 后序遍历序列
postM:镜像后序遍历序列
*/
vector<int> origin, pre, preM, post, postM;
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> &v)
{
if (root == NULL)
{
return;
}
v.push_back(root->data);
preOrder(root->left, v);
preOrder(root->right, v);
}
// 镜像先序
void preOrderMirror(node *root, vector<int> &v)
{
if (root == NULL)
{
return;
}
v.push_back(root->data);
preOrderMirror(root->right, v);
preOrderMirror(root->left, v);
}
//后序
void postOrder(node *root, vector<int> &v)
{
if (root == NULL)
{
return;
}
postOrder(root->left, v);
postOrder(root->right, v);
v.push_back(root->data);
}
//镜像后行
void postOrderMirror(node* root, vector<int> &v)
{
if (root == NULL)
{
return;
}
postOrderMirror(root->right, v);
postOrderMirror(root->left, v);
v.push_back(root->data);
}
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;
}