个人主页:仍有未知等待探索-CSDN博客
专题分栏:C++
目录
一、概念
二叉搜索树,又称二叉排序树(中序是有序的)。
性质
1、非空左子树的键值小于根节点的键值
2、非空右子树的键值大于根节点的键值
(空树也是二叉搜索树)
节点结构
左孩子、右孩子、值
template<class T> struct BSTN { BSTN(const T& e) :left(nullptr) ,right(nullptr) ,val(e) {} BSTN<T>* left; BSTN<T>* right; T val; };
二、操作
查找
查找,从根节点开始比较键值大小,如果比根节点的键值小,进左子树;比根节点的键值大,进右子树,然后继续进行比较。
插入
和查找差不多,先找到要插入的位置,然后进行插入即可。
// 要插入的值 val void insert(const T& val) { // 特判一下空树 if (_root == nullptr) { node* tmp = new node(val); _root = tmp; return; } // 记得要记录一下插入位置的父节点 node* parent = _root; node* cur = _root; while (cur) { if (cur->val > val) { parent = cur; cur = cur->left; } else { parent = cur; cur = cur->right; } } cur = new node(val); if (parent->val > val) { parent->left = cur; } else { parent->right = cur; } }
删除
删除一个节点的情况比较复杂,分为四种情况。
a.删除的节点为叶子节点
如果要删除 13 这个叶子节点,我们只需要让 13 的父节点的左孩子指向nullptr。
如果要删除 7 这个叶子节点,我们需要让 7 的父节点的右孩子指向nullptr。
总结:让要删除节点的父节点的对应指针指向空。
对应指针: