题解参考 :http://blog.csdn.net/acm_ted/article/details/20715415
题解:
1:通过输入构造二叉排序树
2:先序遍历并与输入顺序比较
3:如果比较不符合再构造镜像二叉排序树
4:比较输出结果
#include <iostream>
#include <algorithm>
#include <vector>
#include <stdio.h>
using namespace std;
struct Node
{
int value;
Node *left;
Node *right;
};
vector<int> testpreorder;
int *preorder;
int n;
bool first = true;
void buildTree(Node **tree, int x)
{
if((*tree) == NULL)
{
(*tree) = new Node;
(*tree)->value = x;
(*tree)->left = NULL;
(*tree)->right = NULL;
return;
}
if(x < (*tree)->value)
buildTree(&((*tree)->left), x);
else
buildTree(&((*tree)->right), x);
}
void buildMirror(Node **tree)
{
if((*tree) == NULL)
return;
Node *temp = (*tree)->left;
(*tree)->left = (*tree)->right;
(*tree)->right = temp;
buildMirror(&((*tree)->left));
buildMirror(&((*tree)->right));
}
void postTravel(Node *tree)
{
if(tree == NULL)
return;
postTravel(tree->left);
postTravel(tree->right);
if(first)
cout << tree->value;
else
cout << " " << tree->value;
first = false;
}
void preTravel(Node *tree)
{
if(tree == NULL)
return ;
testpreorder.push_back(tree->value);
preTravel(tree->left);
preTravel(tree->right);
}
bool isSame()
{
for(int i = 0; i < n; i++)
{
if(preorder[i] != testpreorder[i])
return false;
}
return true;
}
int main()
{
Node *tree = new Node;
tree->left = NULL;
tree->right = NULL;
cin >> n;
preorder = new int[n];
for(int i = 0; i < n; i++)
{
cin >> preorder[i];
if(i == 0)
tree->value = preorder[i];
else
buildTree(&tree, preorder[i]);
}
preTravel(tree);
if(isSame())
{
cout << "YES" << endl;
postTravel(tree);
}
else
{
buildMirror(&tree);
testpreorder.clear();
preTravel(tree);
if(isSame())
{
cout << "YES" << endl;
postTravel(tree);
}
else
cout << "NO" << endl;
}
return 0;
}<strong>
</strong>