伸展树是搜索二叉树的一种延拓,插入与一般二叉树完全相同,只是在搜索元素的时候, 会执行一些额外的操作,来"平衡"二叉树的深度,使之后的搜索平均花费更少的时间.
类的定义形式:
template <typename T>
class SplayTree {
...
};
构造函数:
// template <typename T>
// 空树
SplayTree();
SplayTree(const SplayTree &);
SplayTree(SplayTree &&);
SplayTree(const std::vector<T> &);
SplayTree(std::initializer_list il);
// and more
成员函数(公有):
// 插入
void Insert(const T &val);
// 删除. 返回true, 如果删除成功
bool Delete(const T &val);
// 查找. 返回true, 如果val在树中
bool Find(const T &val);
// 打印出树的内容,中序
void InOrderTraverse();
成员函数(私有):
// helper functions
// 从节点n处,开始执行伸展操作,一路向上直到root
void Splay(shared_ptr<Node> b);
私有数据域:
// root = nullptr if empty
shared_ptr<Node> root_;
使用到的数据结构:
struct Node {
T val;
shared_ptr<Node> left;
shared_ptr<Node> right;
shared_ptr<Node> parent;
};
比较过程中使用<
,当两个比较对象相等是,默认第二个大.
一个节点,左子树元素小于之,右子树元素不小于之.