伸展树的三种旋转:单旋转,一字型旋转,之字形旋转
为了简化程序,将之字形旋转转变为如下旋转方式:
-SplayTree.h 代码:
/*
* by: peige
* 2015/11/29
*/
#ifndef __SPLAY_TREE_H__
#define __SPLAY_TREE_H__
#include <iostream>
template <class T>
struct SplayTreeNode {
T key; // 关键字
SplayTreeNode* left; // 左儿子
SplayTreeNode* right; // 右儿子
SplayTreeNode(const T& value = T(), SplayTreeNode* lt = NULL,
SplayTreeNode* rt = NULL) :key(value), left(lt), right(rt) {}
};
template <class T, class Compare = std::less<T> >
class SplayTree {
private:
SplayTreeNode<T>* mRoot; // 根节点
Compare isLessThan; // Compare
public:
SplayTree();
~SplayTree();
void preOrder()const; // 前序遍历
void inOrder()const; // 中序遍历
void postOrder()const; // 后序遍历
bool find(const T& key);
T findMin(); // 查找最小结点,返回键值
T findMax(); // 查找最大结点,返回键值
void splay(const T& key); // 旋转key对应的结点为根节点
void insert(const T& key); // 将结点(key为结点键值)插入到伸展树中
void remove(const T& key); // 删除结点(key为结点键值)
void destroy(); // 销毁伸展树
void print()const; // 打印伸展树
private:
void preOrder(SplayTreeNode<T>* node)const;
void inOrder(SplayTreeNode<T>* node)const;
void postOrder(SplayTreeNode<T>* node)const;
bool find(SplayTreeNode<T>*& node, const T& key);
T findMin(SplayTreeNode<T>*& node);
T findMax(SplayTreeNode<T>*& node);
// 旋转key对应的节点为根节点,并返回值为根节点
void splay(SplayTreeNode<T>*& node, const T& key);
void destroy(SplayTreeNode<T>*& node);
void print(SplayTreeNode<T>* node, const T& key, const int& direction)const;
void rotateWithLeftChild(SplayTreeNode<T>*& k1); // 左单旋
void rotateWithRightChild(SplayTreeNode<T>*& k1); // 右单旋
};
// constructor
template <class T, class Compare>
SplayTree<T, Compare>::SplayTree() :mRoot(NULL) {
}
// destructor
template <class T,