二叉搜索树 增加, 查找, 删除

#include <bits/stdc++.h>
using namespace std;

struct Node {
    int key;
    Node *right, *left, *parent;
};

Node *root, *NIL;

void insert(int k) {
    Node *y = NIL;
    Node *x = root;
    Node *z;

    z = (Node *)malloc(sizeof(Node));
    z -> key = k;
    z -> left = NIL;
    z -> right = NIL;

    while(x != NIL) {
        y = x;
        if(z -> key < x -> key)
            x = x -> left;
        else
            x = x -> right;
    }

    z -> parent = y;
    if(y == NIL)
        root = z;
    else {
        if(z -> key < y -> key)
            y -> left = z;
        else
            y -> right = z;
    }
}

Node * find(Node *u, int k) {
    while(u != NIL && k != u -> key) {
        if(k < u -> key) u = u -> left;
        else u = u -> right;
    }
    return u;
}

void inorder(Node *u) {
    if(u == NIL) return;
    inorder(u -> left);
    printf(" %d", u -> key);
    inorder(u -> right);
}

void preorder(Node *u) {
    if(u == NIL) return;
    printf(" %d", u -> key);
    preorder(u -> left);
    preorder(u -> right);
}

Node * treeMinimum(Node *x) {
    while(x -> left != NIL) x = x -> left;
    return x;
}

Node * treeSuccessor(Node *x) {
    if(x -> right != NIL) return treeMinimum(x -> right);
    Node *y = x -> parent;
    while(y != NIL && x == y -> right) {
        x = y;
        y = y -> parent;
    }
    return y;
}

void treeDelete(Node *z) {
    Node *y;
    Node *x;

    if(z -> left == NIL || z -> right == NIL)
        y = z;
    else
        y = treeSuccessor(z);

    if(y -> left != NIL)
        x = y -> left;
    else
        x = y -> right;

    if(x != NIL)
        x -> parent = y -> parent;

    if(y -> parent == NIL)
        root = x;
    else {
        if(y == y -> parent -> left)
            y -> parent -> left = x;
        else
            y -> parent -> right = x;
    }

    if(y != z)
        z -> key = y -> key;

    free(y);
}

int main() {
    int n, x;
    string com;
    scanf("%d", &n);
    for(int i = 0; i < n; i ++) {
        cin >> com;
        if(com[0] == 'f') {
            scanf("%d", &x);
            Node *t = find(root, x);
            if(t != NIL)
                printf("yes\n");
            else
                printf("no\n");
        } else if(com == "insert") {
            scanf("%d", &x);
            insert(x);
        } else if (com == "print") {
            inorder(root);
            printf("\n");
            preorder(root);
            printf("\n");
        } else if(com == "delete") {
            scanf("%d", &x);
            treeDelete(find(root, x));
        }
    }
    return 0;
}

  

posted @ 2018-10-25 21:08  丧心病狂工科女  阅读(254)  评论(0编辑  收藏  举报