Day 45 算法笔记之提高篇(3) 9.4 二叉查找树

目录

一.基本操作

1.查找

2.插入

3.二叉搜索树的建立

4.最大最小值

5.删除

6.Is It a Binary Search Tree

7.Complete Binary Search Tree

8.Build A Binary Search Tree


一.基本操作

1.查找

void search(node* root,int x){
	if(root==NULL){
		printf("search failed\n");
		return;
	}
	if(x==root->data){
		printf("%d\n",root->data);
	}else if(x<root->data){
		search(root->lchild,x);
	}else{
		search(root->rchild,x)
	}
}

2.插入

void search(node* &root,int x){
	if(root==NULL){
		root=newnode(x);
		return;
	}
	if(x==root->data){
		return;
	}else if(x<root->data){
		search(root->lchild,x);
	}else{
		search(root->rchild,x)
	}
}

3.二叉搜索树的建立

node* create(int data[],int n){
	node* root = NULL;
	for(int i=0;i<n;i++){
		insert(root,data[i]);
	}
	return root;
}

4.最大最小值

node* findmax(node* root){
	while(root->rchild!=NULL){
		root = root->rchild;
	}
	return root;
}

node* findmin(node* root){
	while(root->lchild!=NULL){
		root=root->lchild;
	}
	return root;
}

5.删除

void deletenode(node* &root,int x){
	if(root==NULL) return;
	if(root->data==x){
		if(root->lchild==NULL&&root->rchild==NULL){
			root = NULL;
		}else if(root->lchild!=NULL){
			node* pre = findmax(root->lchild);
			root->data = pre->data;
			deletenode(root->lchild,pre->data);
		}else{
			node* next = findmin(root->rchild);
			root->data=next->data;
			deletenode(root->rchild,next->data);
		}
	}else if(root->data>x){
		deletenode(root->lchild,x);
	}else{
		deletenode(root->rchild,x);
	}
}

6.Is It a Binary Search Tree

#include<cstdio>
#include<cmath>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;

struct node{
	int data;
	node* left;
	node* 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);
}

vector<int> orgin,pre,prem,post,postm;

int main(){
	
	int n;
	scanf("%d",&n);
	
	node* root=NULL;
	int data;
	for(int i=0;i<n;i++){
		scanf("%d",&data);
		orgin.push_back(data);
		insert(root,data);
	}
	
	preorder(root,pre);
	preordermirror(root,prem);
	postorder(root,post);
	postordermirror(root,postm);
	
	if(orgin==pre){
		printf("YES\n");
		for(int i=0;i<post.size();i++){
			printf("%d",post[i]);
			if(i<post.size()-1) printf(" ");
		}
	}else if(orgin==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;
}

7.Complete Binary Search Tree

#include<cstdio>
#include<cmath>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;

const int maxn=1010;
int n,number[maxn],cbt[maxn],index=0;

void inorder(int root){
	if(root>n) return;
	inorder(root*2);
	cbt[root] = number[index++];
	inorder(root*2+1);
}

int main(){
	
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&number[i]);
	}
	sort(number,number+n);
	inorder(1);
	for(int i=1;i<=n;i++){
		printf("%d",cbt[i]);
		if(i<n) printf(" ");-
	}
	
	return 0;
}

8.Build A Binary Search Tree

#include<cstdio>
#include<cmath>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;

const int maxn=110;
struct node{
	int data;
	int lchild,rchild;
}nodes[maxn];

int n,in[maxn],num=0;

void inorder(int root){
	if(root == -1) return;
	inorder(nodes[root].lchild);
	nodes[root].data=in[num++];
	inorder(nodes[root].rchild);
}

void bfs(int root){
	queue<int> q;
	q.push(root);
	num=0;
	while(!q.empty()){
		int now=q.front();
		q.pop();
		printf("%d",nodes[now].data);
		num++;
		if(num<n) printf(" ");
		if(nodes[now].lchild!=-1) q.push(nodes[now].lchild);
		if(nodes[now].rchild!=-1) q.push(nodes[now].rchild);
	}
}

int main(){
	
	int lchild,rchild;
	scanf("%d",&n);
	
	for(int i=0;i<n;i++){
		scanf("%d%d",&lchild,&rchild);
		nodes[i].lchild=lchild;
		nodes[i].rchild=rchild;
	}
	for(int i=0;i<n;i++){
		scanf("%d",&in[i]);
	}
	sort(in,in+n);
	inorder(0);
	bfs(0);
	return 0;
}

おすすめ

転載: blog.csdn.net/aixiaoxiao13/article/details/121470602