思路
1)首先按照题目给出的顺序构造二叉排序树。注意构造的时候初始 node root=NULL
2)运用STL中的vector分别求出该二叉树的先序遍历,后序遍历,镜像序列以及镜像序列的后序遍历
#include <cstdio>
#include <vector>
using namespace std;
struct node
{
int data;
node* lchild;
node* rchild;
};
//插入结点
void insert(node* &root,int data)
{
if(root==NULL)
{
//是在root上进行操作,而不是新生成一个节点进行操作
root = new node;
root->data = data;
root->lchild= root->rchild= NULL;
return;
}
if(data < root->data)
insert(root->lchild,data);
else
insert(root->rchild,data);
}
//先序遍历
void PreOrder(node *root ,vector<int> &vi)
{
if(root != NULL)
{
vi.push_back(root->data);
PreOrder(root->lchild,vi);
PreOrder(root->rchild,vi);
}
}
//后序遍历
void PostOrder(node *root,vector<int> &vi)
{
if(root != NULL)
{
PostOrder(root->lchild,vi);
PostOrder(root->rchild,vi);
vi.push_back(root->data);
}
}
//镜像序列
void MirrorOrder(node *root,vector<int> &vi)
{
if(root!=NULL)
{
vi.push_back(root->data);
MirrorOrder(root->rchild,vi);
MirrorOrder(root->lchild,vi);
}
}
//镜像序列的后序序列
void PostMirror(node *root,vector<int> &vi)
{
if(root!=NULL)
{
PostMirror(root->rchild,vi);
PostMirror(root->lchild,vi);
vi.push_back(root->data);
}
}
int main()
{
int n;
scanf("%d",&n);
node *root = NULL;
vector<int> origin,Pre,mirror;
for(int i=0;i<n;i++)
{
int data;
scanf("%d",&data);
origin.push_back(data);
insert(root,data);
}
PreOrder(root,Pre); //得到先序遍历的向量
MirrorOrder(root,mirror);
vector<int> temp;
if(origin==Pre || origin==mirror)
{
if(origin==Pre)
PostOrder(root,temp);
else
PostMirror(root,temp);
printf("YES\n");
for(int i=0;i<temp.size();i++)
{
printf("%d",temp[i]);
if(i!=temp.size()-1)
printf(" ");
}
}else
printf("NO");
return 0;
}