一、定义:
- 要么二叉查找树是一棵空树
- 要么二叉查找树由根结点、左子树、右子树组成,其中左子树和右子树都是二叉查找树,且左子树上的所有节点的数据域都小于或等于根结点的数据域,右子树上所有节点的数据域都大于根结点的数据域。
二、二叉查找树的基本操作
2.1查找操作
void search(node* root,int x){
if(root==NULL){
printf("Failed!");
return;
}
if(x==root->data){
printf("%d\n",root->data);
}else if(x>root->data){
search(root->right,x);
}else{
search(root->left,x);
}
}
2.2 插入操作
void insert(node* &root,int x){
if(root==NULL){
root=newNode(x);
return;
}
if(x==root->data){
return;
}else if(x<root->data){
insert(root->left,x);
}else{
insert(root->right,x);
}
}
2.3 建立二叉查找树
node* create(int data[],int n){
node* root=NULL;
for(int i=0;i<n;i++){
insert(root,data[i]);
}
return root;
}
2.4 删除某个节点
把以二叉查找树中比结点权值小的最大结点称为该结点的前驱,把比结点权值大的最小结点称为该结点的后继;
//寻找root为根结点的树中的最大权值结点node* findMin(node* root){
while(root->left!=NULL){
root=root->right;
}
return root;
}
//寻找以root为根结点的树中的最小权值结点node* findMax(node* root){
while(root->left!=NULL){
root=root->left;
}
return root;
}
void deleteNode(node* root,int x){
if(root==NULL)return;
if(root->data==x){
if(root->left==NULL && root->right==NULL){
root=NULL;
}else if(root->left!=NULL){
node* pre=findMax(root->left);
root->data=pre->data;
deleteNode(root->left,pre->data);
}else{
node* nex=findMin(root->right);
root->data=nex->data;
deleteNode(root->right,nex->data);
}
}else if(root->data>x){
deleteNode(root->left,x);
}else{
deleteNode(root->right,x);
}
}