L2-004 搜索树判断 (25 分)
对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值。如果我们交换每个节点的左子树和右子树,得到的树叫做镜像二叉搜索树。
现在我们给出一个整数键值序列,请编写程序判断该序列是否为某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,如果是,则输出对应二叉树的后序遍历序列。
输入格式:
输入的第一行包含一个正整数N(≤1000),第二行包含N个整数,为给出的整数键值序列,数字间以空格分隔。
输出格式:
输出的第一行首先给出判断结果,如果输入的序列是某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,则输出YES,否侧输出NO。如果判断结果是YES,下一行输出对应二叉树的后序遍历序列。数字间以空格分隔,但行尾不能有多余的空格。
输入样例1:
7
8 6 5 7 10 8 11
输出样例1:
YES
5 7 6 8 11 10 8
输入样例2:
7
8 6 8 5 10 9 11
输出样例2:
NO
思路:
创建二叉树 分别进行先根遍历和镜像遍历,用vector存起来
和初始串顺序进行比较。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
using namespace std;
//用vector集合将先根遍历、后根遍历以及它们的镜像存起来 方便和原始串orgin比较
vector<int> origin,pre,preN,postN,post;
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>&vi)
{
if(root==NULL) return;
vi.push_back(root->data);
preOrder(root->left,vi);
preOrder(root->right,vi);
}
//镜像 先右孩子再左孩子
void preOrderMirror(node* root,vector<int>&vi)
{
if(root==NULL) return;
vi.push_back(root->data);
preOrderMirror(root->right,vi);
preOrderMirror(root->left,vi);
}
void postOrder(node* root,vector<int>& vi)
{
if(root==NULL) return;
postOrder(root->left,vi);
postOrder(root->right,vi);
vi.push_back(root->data);
}
//镜像 先右孩子再左孩子
void postOrderMirror(node* root,vector<int>&vi)
{
if(root==NULL) return;
postOrderMirror(root->right,vi);
postOrderMirror(root->left,vi);
vi.push_back(root->data);
}
int main()
{
int n,data;
node* root=NULL;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>data;
origin.push_back(data);//初始串存起来
insert(root,data);//先根法插入结点
}
preOrder(root,pre);//先根遍历
preOrderMirror(root,preN);//镜像
if(origin==pre)
{
printf("YES\n");
postOrder(root,post);//后根
for(int i=0;i<post.size();i++)
{
printf("%d",post[i]);
if(i<post.size()-1) printf(" ");
}
}
else if(origin==preN)
{
printf("YES\n");
postOrderMirror(root,postN);//后根镜像
for(int i=0;i<postN.size();i++)
{
printf("%d",postN[i]);
if(i<postN.size()-1) printf(" ");
}
}
else printf("NO\n");
return 0;
}