伸展树

伸展树结合了二叉搜索树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 };
posted @ 2012-10-02 15:42  traits  阅读(319)  评论(0编辑  收藏  举报