二叉搜索树(验证合法性以及增删查改)

这篇博客介绍了二叉搜索树的基本操作。首先,讲解了如何验证一个二叉树是否为有效的二叉搜索树,通过递归检查每个节点的值是否满足搜索树条件。接着,展示了在二叉搜索树中查找特定值的算法,通过比较节点值进行左右遍历。然后,阐述了如何插入一个新值到二叉搜索树中,保持树的结构。最后,详细说明了删除二叉搜索树中指定节点的方法,考虑了不同情况下的处理策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

验证二叉搜索树

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

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

class Solution
{
public:
    bool isValidBST(TreeNode *root, TreeNode *Min, TreeNode *Max)
    {
        if (root == nullptr)
        {
            return true;
        }

        if (Min != nullptr && root->val <= Min->val)
        {
            return false;
        }

        if (Max != nullptr && root->val >= Max->val)
        {
            return false;
        }

        return isValidBST(root->left, Min, root) && isValidBST(root->right, root, Max);
    }

    bool isValidBST(TreeNode *root)
    {
        return isValidBST(root, nullptr, nullptr);
    }
};

二叉搜索树中的搜索

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

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

class Solution
{
public:
    TreeNode *searchBST(TreeNode *root, int val)
    {
        if (root == nullptr)
            return nullptr;

        if (root->val == val)
            return root;

        if (root->val > val)
        {
            return searchBST(root->left, val);
        }

        if (root->val < val)
        {
            return searchBST(root->right, val);
        }

        return nullptr;
    }
};

二叉搜索树中的插入操作

#include <bits/stdc++.h>

using namespace std;

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

class Solution
{
public:
    TreeNode *insertIntoBST(TreeNode *root, int val)
    {
        if (root == NULL)
        {
            return new TreeNode(val);
        }

        if (root->val > val)
        {
            root->left = insertIntoBST(root->left, val);
        }
        else if (root->val < val)
        {
            root->right = insertIntoBST(root->right, val);
        }

        return root;
    }
};

删除二叉搜索树的节点

#include <bits/stdc++.h>

using namespace std;

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

class Solution
{
public:
    TreeNode *deleteNode(TreeNode *root, int key)
    {
        if (root == nullptr)
        {
            return nullptr;
        }

        if (root->val == key)
        {
            //情况1:子节点或者只有左子树或者右子树
            if (root->left == nullptr)
            {
                return root->right;
            }

            if (root->right == nullptr)
            {
                return root->left;
            }

            //情况2:含左右子树
            //右子树最小值
            TreeNode *node = root->right;
            while (node->left != nullptr)
            {
                node = node->left;
            }

            //删除右子树最小节点
            root->right = deleteNode(root->right, node->val);
            node->left = root->left;
            node->right = root->right;
            root = node;
        }

        if (root->val > key)
        {
            root->left = deleteNode(root->left, key);
        }

        if (root->val < key)
        {
            root->right = deleteNode(root->right, key);
        }
        return root;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值