1043 Is It a Binary Search Tree
Posted CSU迦叶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1043 Is It a Binary Search Tree相关的知识,希望对你有一定的参考价值。
1. 这是二叉查找树BST那节的习题,要做出来这题,需要具备的基础知识有:BST的创建,涉及函数createBST,insertBST,newNode,二叉树的先序遍历、后序遍历。
2. 需要转过来的弯的有:
给定了序列,其实就可以创建出唯一的BST了。也就是一开始给定的那个序列,不要管他是什么序,反正就是个确定的序列。后面用来比对的时候再看他是不是先序,是不是镜像先序。
所谓镜像就是把检索左右子树的位置互换以下。
3. 一个非常使用的技巧:向量容器盛整数可以直接比对序列。详见妙用vector:根据第一个不等的元素比较两个序列大小的利器
4. 我犯了一个非常傻的错误,在遍历的时候第一句应该是root==NULL退出,写成了!=,导致我一直在纠结传进来的参数的引用写的对不对。也调试不出,后来猛然看见的。
AC代码
#include<cstdio>
#include<map>
#include<set>
#include<string>
#include<cstring>
#include<iostream>
#include<vector>
#include<stack>
#include<queue>
#include<algorithm>
#include<cmath>
typedef long long LL;
using namespace std;
const int maxn = 100010;
struct Node{
int data;
Node *lchild,*rchild;
};
Node* newNode(int v){
Node* node = new Node;//申请变量的地址空间
node->lchild = node->rchild = NULL;//新建的结点没有左右孩子
node->data = v;//数据域为传进的参数值
return node;
}
void insertBST(Node* &root,int v){//由于要对二叉树的结构进行修改,所以传入根节点的引用
if(root==NULL){//查找失败的位置,就是要插入的位置
root = newNode(v);
return;
}
if(v<root->data)insertBST(root->lchild,v);//根据BST的性质,此时往左子树搜索
else insertBST(root->rchild,v);
}
Node* createBST(vector<int> data,int n){//data是待插入值域的数组,n是数组长度
Node* root = NULL;
for(int i=0;i<n;i++){
insertBST(root,data[i]);
}
return root;
}
void preOrder(Node* root,vector<int>& preSeq){
if(root==NULL)return;
preSeq.push_back(root->data);
preOrder(root->lchild,preSeq);
preOrder(root->rchild,preSeq);
}
void mirrorPreOrder(Node* root,vector<int>& mirrorPreSeq){
if(root==NULL)return;
mirrorPreSeq.push_back(root->data);
mirrorPreOrder(root->rchild,mirrorPreSeq);
mirrorPreOrder(root->lchild,mirrorPreSeq);
}
void postOrder(Node* root,vector<int>& postSeq){
if(root==NULL)return;
postOrder(root->lchild,postSeq);
postOrder(root->rchild,postSeq);
postSeq.push_back(root->data);
}
void mirrorPostOrder(Node* root,vector<int>& mirrorPostSeq){
if(root==NULL)return;
mirrorPostOrder(root->rchild,mirrorPostSeq);
mirrorPostOrder(root->lchild,mirrorPostSeq);
mirrorPostSeq.push_back(root->data);
}
int main(){
int n,data;
vector<int> initSeq,preSeq,mirrorPreSeq,postSeq,mirrorPostSeq;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&data);
initSeq.push_back(data);
}
Node* root = createBST(initSeq,n);
preOrder(root,preSeq);
if(preSeq==initSeq){
printf("YES\\n");
postOrder(root,postSeq);
for(int i=0;i<postSeq.size();i++){
printf("%d",postSeq[i]);
if(i!=postSeq.size()-1)printf(" ");
}
return 0;
}
mirrorPreOrder(root,mirrorPreSeq);
if(mirrorPreSeq==initSeq){
printf("YES\\n");
mirrorPostOrder(root,mirrorPostSeq);
for(int i=0;i<mirrorPostSeq.size();i++){
printf("%d",mirrorPostSeq[i]);
if(i!=mirrorPostSeq.size()-1)printf(" ");
}
return 0;
}
printf("NO");
return 0;
}
以上是关于1043 Is It a Binary Search Tree的主要内容,如果未能解决你的问题,请参考以下文章
1043 Is It a Binary Search Tree (25 分)
1043. Is It a Binary Search Tree (25)
1043. Is It a Binary Search Tree (25)
PAT1043 Is It a Binary Search Tree