一、定义:
- 要么二叉查找树是一棵空树
- 要么二叉查找树由根结点、左子树、右子树组成,其中左子树和右子树都是二叉查找树,且左子树上的所有节点的数据域都小于或等于根结点的数据域,右子树上所有节点的数据域都大于根结点的数据域。
二、二叉查找树的基本操作
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); } }