问题描述
给出一个BTS的结点插入序列,问该序是否为先序遍历的序列 或 镜像BTS(LC > root > RC) 的先序序列,
是就输出对应二叉树的后续遍历序列
代码
#include<stdio.h>
#include<vector>
using namespace std;
struct node{
int data;
node *lc;
node *rc;
};
void insert(node* &root, int data)
{
if(root == NULL)
{
root = new node;
root->data = data;
root->lc = NULL;
root->rc = NULL;
return;
}
if(root->data > data)
{
insert(root->lc, data);
}
else
{
insert(root->rc, data);
}
}
void preOrder(node* root, vector<int> &v)
{
if(root == NULL)
return;
v.push_back(root->data);
preOrder(root->lc, v);
preOrder(root->rc, v);
}
void preOrderMirror(node* root, vector<int> &v)
{
if(root == NULL)
return;
v.push_back(root->data);
preOrderMirror(root->rc, v);
preOrderMirror(root->lc, v);
}
void postOrder(node* root, vector<int> &v)
{
if(root == NULL)
return;
postOrder(root->lc, v);
postOrder(root->rc, v);
v.push_back(root->data);
}
void postOrderMirror(node* root, vector<int> &v)
{
if(root == NULL)
return;
postOrderMirror(root->rc, v);
postOrderMirror(root->lc, v);
v.push_back(root->data);
}
vector<int> origin, pre, preM, post, postM;
int main()
{
int N, data;
node *root = NULL;
scanf("%d", &N);
for (size_t 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 (size_t i = 0; i < post.size(); i++)
{
printf("%d", post[i]);
if(i < post.size() - 1)
printf(" ");
}
}
else if(origin == preM)
{
for (size_t i = 0; i < postM.size(); i++)
{
printf("%d ", postM[i]);
if(i < post.size() - 1)
printf(" ");
}
}
else
{
printf("No\n");
}
return 0;
}```