C++ 浅谈之二叉搜索树
HELLO,各位博友好,我是阿呆 🙈🙈🙈
这里是 C++ 浅谈系列,收录在专栏 C++ 语言中 😜😜😜
本系列阿呆将记录一些 C++ 语言重要的语法特性 🏃🏃🏃
OK,兄弟们,废话不多直接开冲 🌞🌞🌞
一 🏠 概述
树介绍
树是区别于线性表的一种数据结构,是结点的有限集合(磁盘文件系统,树结构)
对树的基本认知:
1、节点的度 :一个节点含有子树个数
2、叶节点 :度为 0 节点
3、分支节点 :度不为 0 节点
4、树的度 :树中最大节点的度
5、节点的层次 : 从根为第一层,子节点为第二层,类推
二叉树
结点有限集合,每个结点最多有两个子树
**满二叉树 **:每一层都是满的(最后一层全是叶节点)
**完全二叉树 **:前 k - 1 层满的,最后一层从左到右连续
针对于完全二叉树,有两种方式实现,数组和链表
二叉搜索树
具有三种性质 :① 若右子树不为空,那么右子树上所有结点大于根结点 ② 若左子树不为空,那么左子树上所有结点小于根结点 ③ 左右子树每个结点均满足上述条件
根据上述特性,下图即为二叉搜索树
子树中一个不满足上述规则,就不是二叉搜索树
一个二叉树是否为搜索树,只需中序遍历,看数据是否从小到大排序即可
二叉搜索树效率为 O(logn) ,但对于单边树情况为 O(n),所以产生了 AVL 树 和 红黑树
二 🏠 核心
二叉搜索树实现
二叉搜索树节点
//与普通二叉树一致, 增加模板参数
template<class K>
struct BSTreeNode {
BSTreeNode<K>* _left;
BSTreeNode<K>* _right;
K _key;
BSTreeNode(const K& key)
:_key(key)
,_left(nullptr)
,_right(nullptr)
{}
};
二叉搜索树构造
只需存入二叉树根节点即可
template<class K>
class BSTree {
typedef BSTreeNode<K> Node;
public:
BSTree() = default; //强制编译器生成默认构造函数
Node* _root = nullptr;
}
二叉搜索树查找
二叉搜索树有序,左树比根小,右树比根大
bool Find(const K& key) { //迭代版本
Node* cur = _root;
while (cur) {
//当前的key小于待查找的key,去当前节点的右子树查找
if (cur->_key < key) cur = cur->_right;
//当前的key大于待查找的key,去当前节点的左子树查找
else if (cur->_key > key) cur = cur->_left;
else return true;
}
return false;
}
二叉搜索树插入
按照前面的规律遍历,只要走到空,该位置即为插入位置
bool Insert(const K& key) { //迭代版本
//空树特殊处理
if (_root == nullptr) {
_root = new Node(key);
return true;
}
//查找对应的插入位置
Node* cur = _root;
Node* parent = nullptr;
//cur走到空开始插入
while (cur) {
if (cur->_key < key) { //走右子树
parent = cur;
cur = cur->_right;
} else if (cur->_key > key) { //走左子树
parent = cur;
cur = cur->_left;
} else {
return false; //树中与插入节点相同值, 会终止插入
}
}
cur = new Node(key);
if (parent->_key < key) parent->_right = cur; //插入到右子树
else parent->_left = cur;//插入到左子树
return true;
}
二叉搜索树节点删除
首先查找元素是否在二叉搜索树中,如果不存在,则返回
否则要删除结点可能分下面四种情况
a、删除结点无孩子结点
b、删除结点只有左孩子结点
c、删除结点只有右孩子结点
d、删除结点有左、右孩子结点
情况 A 可与情况 B 或 C 合并,因此情况如下
情况 B :删除该结点且父结点指向该节点左孩子(直接删除)
情况 C :删除该结点且父结点指向该节点右孩子(直接删除)
情况 D :该节点右子树第一个结点,将值填补到被删除节点(替换法删除)
二叉搜索树应用
K模型
只有 Key 作为关键码,(结构只需存储 Key,关键码即为需要搜索到的值)
比如 :随机生成一个 word,判断该 word 是否存在
单词集中每个单词作为 KEY,构建二叉搜索树并检索是否存在
KV 模型
每一个关键码 Key,都有与之对应的值 Value,即 <Key, Value> 键值对
比如英汉词典英文与中文的对应关系
二叉搜索树的性能,取决于树形状,若类似完全二叉树,则为 O(logn);对于单边树,效率退化为 O(n)
三 🏠 结语
身处于这个浮躁的社会,却有耐心看到这里,你一定是个很厉害的人吧 👍👍👍
各位博友觉得文章有帮助的话,别忘了点赞 + 关注哦,你们的鼓励就是我最大的动力
博主还会不断更新更优质的内容,加油吧!技术人! 💪💪💪