二叉树系列之四:AVL树

AVL树是一种特殊的二叉搜索树,与红黑树相比,其平均性能略低,但最差性能要好于红黑树。

其实现也主要在于插入和删除之后的调整。完整实现如下:

#ifndef _AVL_TREE_H_
#define  _AVL_TREE_H_

#include 
" BSTree.h "

template 
< class  T >
class  AVLTree :  public  BSTree < T >
{
public:
    AVLTree(T data 
= T()) : BSTree(data) { }
    
virtual ~AVLTree() { }

public:
    
void insert(T data)
    
{
        BSTree
<T>::insert(data); 

        
while (avlnode_ != BTNode<T>::nil())
        
{
            avlnode_
->factor_ += (avlnode_->data_ > data) ? MORE : LESS;

            
if (avlnode_->factor_ == LOW) balanceLeft(avlnode_);
            
else if (avlnode_->factor_ == HIGH) balanceRight(avlnode_);

            
if (avlnode_->factor_ == NORMAL) break;

            data 
= avlnode_->data_;
            avlnode_ 
= avlnode_->parent_;
        }

    }

    
void remove(T data)
    
{
        BSTree
<T>::remove(data);

        
while (avlnode_ != BTNode<T>::nil())
        
{
            avlnode_
->factor_ -= (avlnode_->data_ > data) ? MORE : LESS;

            
if (avlnode_->factor_ == LOW) balanceLeft(avlnode_);
            
else if (avlnode_->factor_ == HIGH) balanceRight(avlnode_);

            
if (avlnode_->factor_ == NORMAL) break;

            data 
= avlnode_->data_;
            avlnode_ 
= avlnode_->parent_;
        }

    }


private:
    
void balanceLeft(BTNode<T>* x)
    
{
        
if (x->rchild_->factor_ == MORE) rotateRight(x->rchild_);
        rotateLeft(x); 
        avlnode_ 
= x->parent_;
    }

    
void balanceRight(BTNode<T>* x)
    
{
        
if (x->lchild_->factor_ == LESS) rotateLeft(x->lchild_);
        rotateRight(x);
        avlnode_ 
= x->parent_;
    }

    
void rotateLeft(BTNode<T>* x)
    
{
        BSTree
<T>::rotateLeft(x);

        BTNode
<T> *= x->parent_;
        
++(x->factor_) -= y->factor_ < NORMAL ? y->factor_ : NORMAL; 
        
++(y->factor_) += x->factor_ > NORMAL ? x->factor_ : NORMAL;
    }

    
void rotateRight(BTNode<T>* x)
    
{
        BSTree
<T>::rotateRight(x);

        BTNode
<T> *= x->parent_;
        
--(x->factor_) -= y->factor_ > NORMAL ? y->factor_ : NORMAL; 
        
--(y->factor_) += x->factor_ < NORMAL ? x->factor_ : NORMAL;
    }

}
;

#endif

 注意,这里的代码中插入部分可以正常工作,但删除部分不能。如果有哪位对删除部分的实现很熟悉,请指教。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值