1043 Is It a Binary Search Tree

Posted CSU迦叶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1043 Is It a Binary Search Tree相关的知识,希望对你有一定的参考价值。

1. 这是二叉查找树BST那节的习题,要做出来这题,需要具备的基础知识有:BST的创建,涉及函数createBSTinsertBSTnewNode,二叉树的先序遍历、后序遍历。

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

PAT 1043 Is It a Binary Search Tree[二叉树][难]

1043 Is It a Binary Search Tree (25分)(树的插入)