问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

深入理解二叉搜索树:原理、操作与应用

创作时间:
作者:
@小白创作中心

深入理解二叉搜索树:原理、操作与应用

引用
1
来源
1.
https://cloud.tencent.com/developer/article/2456112

二叉搜索树(Binary Search Tree,简称BST)是一种特殊的二叉树数据结构,它在计算机科学领域具有重要应用。本文将深入探讨二叉搜索树的基本概念、核心操作及其应用场景,帮助读者全面理解这一数据结构的原理和使用方法。

二叉搜索树的基本概念

二叉搜索树是一种特殊的二叉树,其核心特性在于:对于树中的任意一个节点,其左子树上的所有节点的值都小于该节点的值,而其右子树上的所有节点的值都大于该节点的值。这种特性使得二叉搜索树在查找、插入和删除等操作中具有较高的效率。

二叉搜索树具有以下重要性质:

  1. 二叉搜索树的中序遍历结果是一个单调递增的序列。
  2. 二叉搜索树中的每个节点的值都是唯一的。

二叉搜索树的核心操作

1. 查找操作

在二叉搜索树中查找一个特定值的过程非常高效。从根节点开始,如果目标值小于当前节点的值,则转向左子树继续查找;如果目标值大于当前节点的值,则转向右子树继续查找。这个过程会一直持续到找到目标值或到达空节点为止。

bool BST::Search(int val)
{
    return SearchNode(_root, val);
}

bool BST::SearchNode(TreeNode* Node, int val)
{
    if (Node == nullptr)
    {
        return false;
    }
    if (Node->_val == val)
    {
        return true;
    }
    else if (val < Node->_val)
    {
        return SearchNode(Node->_left, val);
    }
    else
    {
        return SearchNode(Node->_right, val);
    }
}

2. 插入操作

插入操作同样利用了二叉搜索树的特性。从根节点开始,根据待插入值与当前节点值的比较结果,决定是向左子树还是右子树递归查找插入位置。当找到空节点时,就在该位置创建新节点并插入值。

void BST::Insert(int val)
{
    _root = InsertNode(_root, val);
}

TreeNode* BST::InsertNode(TreeNode* Node, int val)
{
    if (Node == nullptr)
    {
        return new TreeNode(val);
    }
    if (Node->_val < val)
    {
        Node->_right = InsertNode(Node->_right, val);
    }
    else if (Node->_val > val)
    {
        Node->_left = InsertNode(Node->_left, val);
    }
    return Node;
}

3. 查找最大值或最小值

由于二叉搜索树的特性,最小值一定位于最左侧的叶子节点,而最大值一定位于最右侧的叶子节点。因此,查找最大值或最小值的操作非常简单,只需要沿着相应的方向递归查找即可。

int BST::GetMin()
{
    if (_root == nullptr)
    {
        return INT_MAX;
    }
    TreeNode* min = AssistGetMin(_root);
    return min->_val;
}

TreeNode* BST::AssistGetMin(TreeNode* Node)
{
    if (Node->_left == nullptr)
    {
        return Node;
    }
    return AssistGetMin(Node->_left);
}

int BST::GetMax()
{
    if (_root == nullptr)
    {
        return INT_MAX;
    }
    TreeNode* max = AssistGetMax(_root);
    return max->_val;
}

TreeNode* BST::AssistGetMax(TreeNode* Node)
{
    if (Node->_right == nullptr)
    {
        return Node;
    }
    return AssistGetMax(Node->_right);
}

4. 删除操作

删除操作相对复杂一些,主要分为三种情况:

  1. 要删除的节点没有子节点
  2. 要删除的节点只有一个子节点
  3. 要删除的节点有两个子节点

对于第三种情况,通常会用该节点的前驱节点(左子树的最大值节点)或后继节点(右子树的最小值节点)来替代被删除的节点。

void BST::Delete(int val)
{
    _root = AssistDelete(_root, val);
}

TreeNode* BST::FindPrev(TreeNode* root, TreeNode* Node)
{
    if (root->_left == Node || root->_right == Node)
    {
        return root;
    }
    if (root->_val < Node->_val)
    {
        FindPrev(root->_right, Node);
    }
    if (root->_val > Node->_val)
    {
        FindPrev(root->_left, Node);
    }
}

TreeNode* BST::AssistDelete(TreeNode* node, int val)
{
    if (node == nullptr)
    {
        return node;
    }
    if (val < node->_val)
    {
        node->_left = AssistDelete(node->_left, val);
    }
    else if (val > node->_val)
    {
        node->_right = AssistDelete(node->_right, val);
    }
    else
    {
        if (node->_left == nullptr)
        {
            TreeNode* temp = node->_right;
            delete node;
            return temp;
        }
        else if (node->_right == nullptr)
        {
            TreeNode* temp = node->_left;
            delete node;
            return temp;
        }
        TreeNode* temp = AssistGetMin(node->_right);
        node->_val = temp->_val;
        node->_right = AssistDelete(node->_right, temp->_val);
    }
    return node;
}

5. 遍历操作

二叉搜索树的遍历操作与普通二叉树相同,包括前序遍历、中序遍历和后序遍历。其中,中序遍历会按照节点值的升序输出所有节点。

void BST::PostOrder()
{
    AssistPostOrder(_root);
}

void BST::AssistPostOrder(TreeNode* Node)
{
    if (Node == nullptr)
    {
        return;
    }
    AssistPostOrder(Node->_left);
    AssistPostOrder(Node->_right);
    cout << Node->_val << ' ';
}

void BST::InOrder()
{
    AssistInOrder(_root);
}

void BST::AssistInOrder(TreeNode* Node)
{
    if (Node == nullptr)
    {
        return;
    }
    AssistInOrder(Node->_left);
    cout << Node->_val << ' ';
    AssistInOrder(Node->_right);
}

void BST::PrevOrder()
{
    AssistPrevOrder(_root);
}

void BST::AssistPrevOrder(TreeNode* Node)
{
    if (Node == nullptr)
    {
        return;
    }
    cout << Node->_val << ' ';
    AssistPrevOrder(Node->_left);
    AssistPrevOrder(Node->_right);
}

总结

二叉搜索树作为一种重要的数据结构,在计算机科学领域发挥着重要作用。通过其排序性质和高效的搜索、插入和删除操作,二叉搜索树成为了解决各种问题的有力工具。在实际应用中,需要注意二叉搜索树可能存在的不平衡问题,以保证其性能。深入了解二叉搜索树将有助于更好地理解和应用数据结构与算法,提高编程能力,并解决更复杂的计算问题。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号