二叉搜索树的删除:
(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;
- }