测试点5,6均是同一种情况,那便是该BST树的先序和其镜像树的先序序列完全相同,这种情况下要按原树进行后序遍历而不是镜像BST树!
BST先序遍历==树的插入顺序
BST的中序遍历==有序序列
附本人AC代码:
#include<iostream>
#include<vector>
using namespace std;
struct Node {
int val;
Node*left, *right;
};
void MT1(Node*&T,Node*&Root) {
if (Root == NULL) {
Root = T;
return;
}
if (T->val < Root->val) {
MT1(T, Root->left);
}
else MT1(T, Root->right);
}
vector<int>V1, V2, ans, res;
void pre1(Node*T) {
if (T == NULL)return;
V1.push_back(T->val);
pre1(T->left);
pre1(T->right);
}
void pre2(Node*T) {
if (T == NULL)return;
V2.push_back(T->val);
pre2(T->right);
pre2(T->left);
}
void post1(Node*T) {
if (T == NULL)return;
post1(T->left);
post1(T->right);
res.push_back(T->val);
}
void post2(Node*T) {
if (T == NULL)return;
post2(T->right);
post2(T->left);
res.push_back(T->val);
}
int main() {
int N;
Node *root1 = new Node();
root1 = NULL;
scanf("%d", &N);
for (int i = 0; i < N; i++) {
Node*tmp = new Node();
scanf("%d", &tmp->val);
ans.push_back(tmp->val);
MT1(tmp, root1);
}
pre1(root1);
pre2(root1);
if (V1 == ans) {
printf("YES\n");
post1(root1);
}
else if (V2 == ans) { //此处不加else测试点5,6出错
printf("YES\n");
post2(root1);
}
if (res.size() == 0)printf("NO\n");
else for (int i = 0; i < res.size(); i++) {
if (i == 0)printf("%d", res[i]);
else printf(" %d", res[i]);
}
return 0;
}