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

 

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 @   stackupdown  阅读(696)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示