1. 二叉搜索树的概念
二叉搜索树又称二叉排序树,它可以是一颗空树。 它是具有以下性质的二叉树: 如果树不为空时:
- 非空左子树的所有节点的值小于其根节点的值。
- 非空左子树的所有节点的值小于其根节点的值。
- 左右子树都是二叉搜索树
- 节点的值都是唯一的,不存在相等值的两个节点
为什么又可以叫二叉排序树呢? 因为二叉搜索树的中序遍历的结果一定是一个升序序列
那么,二叉搜索树应该是链式结构还是顺序结构呢? 其实很容易想到,这棵树需要具备增删的功能,若是顺序结构,每次都得挪动数据,效率太差。 因此,二叉搜索树是链式结构。
2. 二叉搜索树的操作及模拟实现
这里操作的实现可以有两种方式:递归和非递归(迭代)。这里我们两者一起实现。
2.1 查找
- 从根开始比较,查找,比根大则往右边走查找,比根小则往左边走查找。
- 最多查找高度次,走到到空,还没找到,这个值不存在。
非递归:
代码语言:javascript
AI代码解释
bool Find(const K& key)
{
Node* cur = _root;
while (cur)
{
if (cur->_key > key)//比根小就往左走
{
cur = cur->_left;
}
else if (cur->_key < key)//比根大就往右走
{
cur = cur->_right;
}
else//与根相等就找到了
{
return true;
}
}
return false;
}
递归:
代码语言:javascript
AI代码解释
bool _FindR(Node* root, const K& key)
{
if (root == nullptr)
{
return false;
}
if (root->_key > key)//比根小了,就在左子树上查找
{
_FindR(root->_left, key);
}
else if (root->_key < key)//比根大了,就在右子树上查找
{
_FindR(root->_right, key);
}
else
{
return true;
}
}
2.2 插入
插入的具体过程分两种情况: a. 树为空,则直接新增节点,赋值给root指针 b. 树不空,按二叉搜索树性质查找插入位置,插入新节点
如果有重复的节点,则插入失败,返回false。
:红黑树详解&spm=1001.2101.3001.5002&articleId=157896818&d=1&t=3&u=05fa77f68ac04bc0b4cb7bbd891a5687)
7398

被折叠的 条评论
为什么被折叠?



