《算法笔记》P315
这一题主要是vector的&的用法(第一次见)
判断两个vector是否相等
镜像树的先序、后序遍历
#include <stdio.h>
#include <vector>
using namespace std;
vector<int> origin,pre,preM,post,postM;//保存初始数据、前序、镜像前序、后序、镜像后序
struct node{
int data;
node* left;
node* right;
};
//插入节点
void insert(node* &root,int data){//插入用的是&root,一直如此
if(root == NULL){
root = new node;
root->data = data;
root->left = root->right = NULL;
}
else if(root->data >data) insert(root->left,data);
else insert(root->right,data);
}
//先序遍历
void preorder(node* root,vector<int>&vi){//用vector容器存储,每次都修改,所以用&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->left,vi);
postorderMirror(root->right,vi);
vi.push_back(root->data);
}
int main(){
int n,data;
node* root = NULL;
scanf("%d",&n);
for(int 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(int i = 0;i <post.size();i++){
printf("%d",post[i]);
if(i <post.size()-1) printf(" ");
}
}
else if(origin == preM){ //初始序列等于镜像先序序列
printf("YES\n");
for(int i = 0;i <postM.size();i++){
printf("%d",postM[i]);
if(i <postM.size() - 1) printf(" ");
}
}
else{
printf("NO\n");
}
return 0;
}