二叉搜索樹的刪除:
(1)、沒有左孩子,直接把右孩子替代刪除結點
(2)、有左孩子但左孩子沒有右孩子,則把左孩子替代刪除結點
(3)、其它,把左孩子的最大的結點替代刪除結點
時間複雜度O(logn)
#include <stdio.h>
#include <malloc.h>
struct node {
node* left;
node* right;
int val;
};
node* ins(node* p, int val) {
if (p == NULL) {
node* q = (node*)malloc(sizeof(node));
q->left = q->right = NULL;
q->val = val;
return q;
} else {
if (p->val > val) {
p->left = ins(p->left, val);
} else {
p->right = ins(p->right, val);
}
return p;
}
}
bool find(node* p, int val) {
if (p == NULL) {
return false;
} else if (p->val == val) {
return true;
} else if (p->val > val) {
return find(p->left, val);
} else {
return find(p->right, val);
}
}
node* del(node* p, int val) {
if (p == NULL) {
return NULL;
} else if (p->val > val) {
p->left = del(p->left, val);
} else if (p->val < val) {
p->right = del(p->right, val);
} else if (p->left == NULL) {
node* q = p->right;
free(p);
return q;
} else if (p->left->right == NULL) {
node* q = p->left;
q->right = p->right;
free(p);
return q;
} else {
node* q;
for (q = p->left; q->right->right != NULL; q = q->right) ;
node* r = q->right;
q->right = r->left;
r->left = p->left;
r->right = p->right;
free(p);
return r;
}
return p;
}
int main() {
int a[] = {7, 2, 15, 1, 5, 4, 6, 10, 17, 8, 11, 16, 19};
int len, i;
node root;
root.left = root.right = NULL;
root.val = 0;
len = sizeof(a) / sizeof(int);
for (i = 0; i < len; i++) {
ins(&root, a[i]);
}
if (find(&root, 15)) {
printf("15 exists\n");
}
del(&root, 15);
if (!find(&root, 15)) {
printf("15 not exists\n");
}
return 0;
}