zoukankan      html  css  js  c++  java
  • 二叉搜索树 增加, 查找, 删除

    #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
    ");
                else
                    printf("no
    ");
            } else if(com == "insert") {
                scanf("%d", &x);
                insert(x);
            } else if (com == "print") {
                inorder(root);
                printf("
    ");
                preorder(root);
                printf("
    ");
            } else if(com == "delete") {
                scanf("%d", &x);
                treeDelete(find(root, x));
            }
        }
        return 0;
    }
    

      

  • 相关阅读:
    HTML初步学习7
    HTML初步学习6
    HTML初步学习5
    HTML初步学习4
    poj3449Geometric Shapes
    poj2074Line of Sight(直线相交)
    2014 Multi-University Training Contest 4
    poj3347Kadj Squares
    poj1556The Doors
    poj3608Bridge Across Islands(凸包间最小距离)
  • 原文地址:https://www.cnblogs.com/zlrrrr/p/9852920.html
Copyright © 2011-2022 走看看