查找操作
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 if( x > root->data){
search (root->rchild, x);
}
}
插入操作
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->lchild, x);
}else if(x > root->data ){
insert(root->rchild, x);
}
}
二叉查找树的建立
node *Create(int data[], int n){
node* root = NULL;
for(int i = 0; i < n; i++){
insert(root, data[i]);
}
return root;
}
删除操作
找以root为根节点的树中最小权值的结点,和最大权值的结点
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;
}
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);
}
}
二叉排序树的中序遍历结果有序
优化手段很多。自己思考。
然后注意下,当我们总是优先删除前驱或者后继,容易导致左右子树极度不平衡,使得二叉查找树退化成一条链,两种解决方法
1)记录左右子树高,删的时候优先删高度高的那一棵。
2)每次交替删前驱或后继