目录
一.基本操作
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;
}