0
点赞
收藏
分享

微信扫一扫

L2-004 搜索树判断 (25 point(s))


对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值。如果我们交换每个节点的左子树和右子树,得到的树叫做镜像二叉搜索树。

现在我们给出一个整数键值序列,请编写程序判断该序列是否为某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,如果是,则输出对应二叉树的后序遍历序列。

输入格式:
输入的第一行包含一个正整数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

**思路:**这道题的关键是掌握构造BST平衡二叉树的算法,也就是如果向一个BST种插入节点。注意看代码种insert函数的写法。

#include<iostream>
#include<vector>

using namespace std;

struct node{
int data;
node * l;
node * r;
};

void insert(node * &BST,int x);


void DLR(node *B, vector<int>&pre);
void DLR_mirror(node *B, vector<int> &pre_mirror);
void LRD(node *B, vector<int> &post);
void LRD_mirror(node *B, vector<int> &post_mirror);

int main(){

int n;
vector<int> initial;
node * B = NULL;
cin >> n;
for(int i = 0; i < n; i++){
int t;
cin >> t;
initial.push_back(t);
insert(B,t);
}
vector <int> pre,pre_mirror,post,post_mirror;

DLR(B,pre);
DLR_mirror(B,pre_mirror);
LRD(B,post);
LRD_mirror(B,post_mirror);

if(initial == pre || initial == pre_mirror){
cout << "YES" << endl;
if(initial == pre){
for(int i = 0; i < post.size(); i++){
if(i)cout<< " ";
cout << post[i];
}
}else{
for(int i = 0; i < post_mirror.size(); i++){
if(i) cout <<" ";
cout << post_mirror[i];
}
}
}else{
cout <<"NO";
}
return 0;
}

void insert(node * &B, int x){
if(B==NULL){
B = new node;
B->data = x;
B->l = NULL;
B->r = NULL;
return;
}

if(x < B->data){
insert(B->l,x);
}else{
insert(B->r,x);
}

}

void DLR(node *B, vector<int>&pre){
if(B){
pre.push_back(B->data);
DLR(B->l,pre);
DLR(B->r,pre);
}
}

void DLR_mirror(node *B, vector<int> &pre_mirror){
if(B){
pre_mirror.push_back(B->data);
DLR_mirror(B->r,pre_mirror);
DLR_mirror(B->l,pre_mirror);
}
}

void LRD(node *B, vector<int> &post){
if(B){
LRD(B->l,post);
LRD(B->r, post);
post.push_back(B->data);
}
}
void LRD_mirror(node *B, vector<int> &post_mirror){
if(B){
LRD_mirror(B->r,post_mirror);
LRD_mirror(B->l, post_mirror);
post_mirror.push_back(B->data);
}
}


举报

相关推荐

0 条评论