伸展树结合了二叉搜索树BST及二叉平衡树AVL的旋转特点,在每一次访问到某节点时都通过旋转将该节点往上推一位,由于没有保存高度信息因为空间复杂度稍优于二叉平衡树。伸展树的插入,删除,搜索的平均时间复杂度均为o(logn),极端情况下为o(n)。伸展树适用于关注用户习惯性行为,用户经常使用的节点将靠近根节点,而用户不经常使用的将远离根节点。
具体实现代码为:
与BST树实现代码一样,如果伸展树遇到不平衡的情况下,代码中的递归调用将会溢出。
1 template<typename T> 2 struct splay_tree_node 3 { 4 splay_tree_node(const T& _element, splay_tree_node *_left = NULL, splay_tree_node *_right = NULL, bool _isdeleted = false) 5 : element(_element) 6 , left(_left) 7 , right(_right) 8 , isdeleted(_isdeleted) 9 { 10 } 11 T element; 12 splay_tree_node *left; 13 splay_tree_node *right; 14 bool isdeleted; 15 }; 16 17 template<typename T> 18 class splay_tree 19 { 20 typedef splay_tree_node<T> tree_node; 21 public: 22 splay_tree() { m_root = NULL; } 23 splay_tree(const splay_tree& rhs) 24 : m_root(clone(rhs.m_root)) 25 {} 26 const splay_tree& operator=(const splay_tree& rhs) 27 { 28 if(this!=&rhs) 29 { 30 clear(); 31 m_root = clone(rhs.m_root); 32 } 33 } 34 35 ~splay_tree() 36 { 37 clear(m_root); 38 } 39 40 public: 41 // 最小值 42 const T& min() const 43 { 44 tree_node* node = min(m_root); 45 if(node) 46 { 47 return node->element; 48 } 49 throw std::runtime_error("查找二叉树无任何节点"); 50 } 51 52 // 最大值 53 const T& max() const 54 { 55 tree_node* node = max(m_root); 56 if(node) 57 { 58 return node->element; 59 } 60 throw std::runtime_error("查找二叉树无任何节点"); 61 } 62 63 // 判断树上是否包含该值 64 bool contains(const T& x) 65 { 66 bool brotate = false; 67 return contains(x,m_root,brotate); 68 } 69 70 // 判断树是否为空 71 bool is_empty() const 72 { 73 return m_root==NULL; 74 } 75 76 // 清空树 77 void clear() 78 { 79 clear(m_root); 80 } 81 82 // 插入值为x的节点 83 void insert(const T& x) 84 { 85 insert(x,m_root); 86 } 87 88 // 移除值为x的节点 89 void remove(const T& x) 90 { 91 remove(x,m_root); 92 } 93 94 // 对所有节点执行某项动作 95 template<typename Functor> 96 void foreach(Functor& functor) 97 { 98 foreach(m_root,functor); 99 } 100 101 private: 102 // 树最小节点 103 tree_node* min(tree_node* t) const 104 { 105 if( t==NULL ) 106 { 107 return NULL; 108 } 109 while(t->left!=NULL) 110 { 111 t = t->left; 112 } 113 return t; 114 } 115 116 // 树最大节点 117 tree_node* max(tree_node* t) const 118 { 119 if( t==NULL ) 120 { 121 return NULL; 122 } 123 while(t->right!=NULL) 124 { 125 t = t->right; 126 } 127 return t; 128 } 129 130 // 判断树是否存在该节点 131 bool contains(const T& x, tree_node*& t, bool& brotate) 132 { 133 if( t == NULL ) 134 { 135 return false; 136 } 137 else if( x<t->element ) 138 { 139 if(contains( x, t->left, brotate )) 140 { 141 if(!brotate) 142 { 143 rotate_single_left(t); 144 brotate = true; 145 } 146 return true; 147 } 148 else 149 { 150 return false; 151 } 152 } 153 else if( x>t->element ) 154 { 155 if(contains(x, t->right, brotate)) 156 { 157 if(!brotate) 158 { 159 rotate_single_right(t); 160 brotate = true; 161 } 162 return true; 163 } 164 else 165 { 166 return false; 167 } 168 } 169 else 170 { 171 if(!t->isdeleted) 172 { 173 return true; 174 } 175 else 176 { 177 return false; 178 } 179 } 180 } 181 182 // 插入节点 183 void insert(const T& x, tree_node*& t) 184 { 185 if( t == NULL ) 186 { 187 t = new tree_node(x,NULL,NULL); 188 } 189 else if( x<t->element) 190 { 191 insert(x,t->left); 192 } 193 else if( x>t->element ) 194 { 195 insert(x,t->right); 196 } 197 else 198 { 199 if(t->isdeleted) 200 { 201 t->isdeleted = false; 202 } 203 } 204 } 205 206 // 移除某节点 207 void remove(const T& x, tree_node*& t) 208 { 209 if( t== NULL ) 210 { 211 return; 212 } 213 else if( x < t->element) 214 { 215 remove(x,t->left); 216 } 217 else if( x > t->element ) 218 { 219 remove(x,t->right); 220 } 221 else if( t->left != NULL && t->right != NULL) 222 { 223 //t->element = min( t->right )->element; 224 //remove( t->element, t->right); 225 t->isdeleted = true; 226 } 227 else 228 { 229 //splay_tree_node *old_node = t; 230 //t = (t->left != NULL)?t->left:t->right; 231 //delete old_node; 232 t->isdeleted = true; 233 } 234 } 235 236 // 清除该节点为根节点的树 237 void clear(tree_node*& t) 238 { 239 if(t != NULL) 240 { 241 clear(t->left); 242 clear(t->right); 243 delete t; 244 t = NULL; 245 } 246 } 247 248 // 对该节点的为根节点的树的所有子节点执行某项动作 249 template<typename Functor> 250 void foreach(tree_node* t, Functor& functor) 251 { 252 if(t!=NULL) 253 { 254 functor(t); 255 foreach(t->left, functor); 256 foreach(t->right, functor); 257 } 258 } 259 260 // 深拷贝树 261 tree_node* clone(tree_node* t) const 262 { 263 if( t==NULL ) 264 { 265 return NULL; 266 } 267 return new tree_node(t->element, clone(t->left), clone(t->right)); 268 } 269 270 // 单旋转-LL 271 void rotate_single_left(tree_node*& k2) 272 { 273 tree_node* k1 = k2->left; 274 k2->left = k1->right; 275 k1->right = k2; 276 k2 = k1; 277 } 278 279 // 单旋转-RR 280 void rotate_single_right(tree_node*& k2) 281 { 282 tree_node* k1 = k2->right; 283 k2->right = k1->left; 284 k1->left = k2; 285 k2 = k1; 286 } 287 288 private: 289 tree_node *m_root; 290 };