【二叉树操作】二叉查找树的查询、插入、删除操作

 

BST 的查询、插入、删除操作

二叉树定义

struct TreeNode {
    int val;
    TreeNode* left, *right;
    TreeNode(int x):val(x),left(NULL), right(NULL) {}
};

插入操作

TreeNode* insert(TreeNode* p, int x) {
    if (p == NULL) {
        TreeNode* q = new TreeNode(0);
        q->val = x;
        q->left = q->right = NULL;
        return q;
    } else {
        if (x < p->val) p->left = insert(p->left, x);
        else p->right = insert(p->right, x);
        return p;
    }
}

查询操作

bool find(TreeNode* p, int x) {
    if (p == NULL) return false;
    else if (x == p->val) return true;
    else if (x < p->val) return find(p->left, x);
    else return find(p->right, x);
}

删除操作

TreeNode* remove(TreeNode* p, int x) {
    if (p == NULL) return NULL;
    else if (x < p->val) p->left = remove(p->left, x);
    else if (x > p->val) p->right = remove(p->right, x);
    else if (p->left == NULL) {
        TreeNode* q = p->right;
        delete p;
        return q;
    }
    else if (p->left->right == NULL) {
        TreeNode* q = p->left;
        q->right = p->right;
        delete p;
        return q;
    }
    else {
        TreeNode* q;
        for (q = p->left; q->right->right != NULL; q = q->right) {}
        TreeNode* r = q->right;
        q->right = r->left;
        r->left = p->left;
        r->right = p->right;
        delete p;
        return r;
    }
    return p;
}

遍历方法:

class Solution0 {
public:
    void traverse(TreeNode* next, int dep) {
        if (next == NULL) {
            for (int i = 0; i < dep; i++) {
                printf("  ");
            }
            printf("NULL\n");
            return;
        }
        if (dep == 0) printf("     -:");
        for (int i = 0; i < dep; i++) {
            printf("  ");
        }
        cout << next->val << " " << next << endl;

        printf("left -:");
        traverse(next->left, dep + 1);
        printf("right-:");
        traverse(next->right, dep + 1);
    }
};

测试

int main() {
    int n;
    int num;
    while (cin >> n) {
        TreeNode* root = NULL;
        for (int i = 0; i < n; i++) {
            cin >> num;
            root = insert(root, num);
        }
        Solution0 sol;
        sol.traverse(root, 0);
        cin >> n;
    // 测试删除的代码
for (int i = 0; i < n; i++) { cin >> num; root = remove(root, num); sol.traverse(root, 0); } } return 0; }

参考:

任何一本算法与数据结构相关的书

posted @ 2017-12-10 16:19  stackupdown  阅读(700)  评论(0)    收藏  举报