AVL_lzw

#include<iostream>
#include<stdlib.h>
using namespace std;


//1.AVL树数据结构 
struct BinaryTreeNode { 
    int key;
    int height;  //记录以该节点位root的树高度
    BinaryTreeNode* left;  //left child
    BinaryTreeNode* right;  //right child 
};

//define AVL node
typedef BinaryTreeNode avlnode;

//define AVL tree
typedef avlnode* avltree;

//比较左右子树高度,取最大的
int maxh( int ha, int hb ) {
    return ha > hb ? ha : hb;
}

//计算树的高度
int height( avltree tree ) {
    if( NULL == tree ) {
        return 0;
    }
    return tree->height;
}


//2.AVL树旋转操作 
//single right rotate for LL model
avlnode* singleRightRotate( avlnode* aNode ) {
    cout<<"//log on singleRightRotate and now the node's value is "<<aNode->key<<endl;
    avlnode* bNode = aNode->left;
    //rebuild relation
    aNode->left = bNode->right;
    bNode->right = aNode;
    //adjust the height
    aNode->height = maxh( height( aNode->right ), height( aNode->left ) ) + 1;
    bNode->height = maxh( height( bNode->right ), height( bNode->left ) ) + 1;
    return bNode;
}

//sigle left rotate for RR model
avlnode* singleLeftRotate( avlnode* aNode ) {
    cout<<"//log on singleLeftRotate and now the node's value is "<<aNode->key<<endl;
    avlnode* bNode = aNode->right;
    //rebuild relation
    aNode->right = bNode->left;
    bNode->left = aNode;
    //adjust the height
    aNode->height = maxh( height( aNode->right ), height( aNode->left ) ) + 1;
    bNode->height = maxh( height( bNode->right ), height( bNode->left ) ) + 1;
    return bNode;
}

//double rotate for LR model
//left rotate first and then right rotate
avlnode* leftRightRotate( avlnode* aNode ) {
    cout<<"||log on leftRightRotate and now the node's value is "<<aNode->key<<endl;
    aNode->left = singleLeftRotate( aNode->left );
    return singleRightRotate(aNode);
}

//double rotate for RL model
//right rotate first and then left rotate
avlnode* rightLeftRotate( avlnode* aNode ) {
    cout<<"||log on rightLeftRotate and now the node's value is "<<aNode->key<<endl;
    aNode->right = singleRightRotate( aNode->right );
    return singleLeftRotate(aNode);
}


//3.插入节点
//insert a key to AVL tree.
avltree avl_insert( avltree &tree, int key ) {
    if( NULL == tree ) {
        tree = (avlnode*)malloc( sizeof( avlnode ) );
        tree->key = key;
        tree->height = 1;
        tree->left = tree->right = NULL;
    }else if( key > tree->key ) {  //insert into the right subtree
        tree->right = avl_insert( tree->right, key );
        int balanceFactor = height( tree->right ) - height( tree->left );
        if( balanceFactor == 2 ) {
            if( key > tree->right->key ) {  //RR model,右侧使用左单旋
                cout<<endl<<"**RR model**,the node's to be single_left_rotated value is "<<tree->key<<" and its height is "<<tree->height<<endl;
                tree = singleLeftRotate(tree);                  
            }
            else{  //RL model,右侧使用RL双旋
                cout<<endl<<"**RL model**,the node's to be right_left_rotated value is "<<tree->key<<" and its height is "<<tree->height<<endl; 
                tree = rightLeftRotate(tree); 
            }
        }       
    }else if( key < tree->key ) {  //insert into the left subtree
        tree->left = avl_insert( tree->left, key );
        int balanceFactor = height( tree->left ) - height( tree->right );
        if( balanceFactor == 2 ) {
            if( key < tree->left->key ) {  //LL model,左侧使用右单旋
                cout<<endl<<"**LL model**,the node's to be single_right_rotated value is "<<tree->key<<" and its height is "<<tree->height<<endl;
                tree = singleRightRotate(tree);                 
            }
            else{  //LR model,左侧使用LR双旋 
                cout<<endl<<"**LR model**,the node's to be left_right_roated value is "<<tree->key<<" and its height is "<<tree->height<<endl;
                tree = leftRightRotate(tree); 
            }
        }       
    }else{  //if the key is already exists, nothing to do...        
    }

    //重新计算树的高度
    tree->height = maxh( height( tree->left ), height( tree->right ) ) + 1;
    cout<<endl<<"now the node's value is "<<tree->key<<" and its height is "<<tree->height<<endl;
    return tree;    
}


//4.删除节点
//delete the given key from AVL tree.
avlnode* avl_delete( avlnode* & tree, int key ) {
    if( NULL == tree ) {
        return NULL;
    }

    //delete the node with the given key
    if( key > tree->key )  {  //key exists in the right subtree
        tree->right = avl_delete( tree->right, key );
    }else if( key < tree->key )  {  //key exists in the left subtree
        tree->left = avl_delete( tree->left, key );
    }else{  //key = tree->key 
        if( NULL != tree->left ) {  //when left is not NULL
            //find max node in left tree
            avlnode* dn = NULL;
            for( dn = tree->left; NULL != dn->right; dn = dn->right ) {             
                //左子树里的最大值在左子树的最右下角 
            }
            //change the value,把tree的左子树里的最大值赋给tree节点,这样通过覆盖的方式就删除了值为key的tree节点 
            tree->key = dn->key;
            //delete the max node,由于这个max node用来替换tree的位置,所以它自己得死亡,这样树的节点总数才会少1 
            cout<<"the next node's to be deleted value is "<<dn->key<<" and its height is "<<dn->height<<endl;
            tree->left = avl_delete( tree->left, dn->key );
            //在tree->left(左子树)里递归得删除值为dn->key的节点。
            //递归的边界就是,某个叶子节点替代了它上一层里需要被删除的节点位置,然后这个叶子节点由于没有替死鬼,就只能被宰割(在最近的下面的else里被杀死) 
        }else if( NULL != tree->right ) {  //when right is not NULL
            //find minimal node in right tree
            avlnode* dn = NULL;
            for( dn = tree->right; NULL != dn->left; dn = dn->left ) {              
                //右子树里的最大值在右子树的最左下角 
            }
            //change the value,把tree的右子树里的最小值赋给tree节点,这样通过覆盖的方式就删除了值为key的tree节点 
            tree->key = dn->key;
            //delete the minimal node,由于这个minimal node用来替换tree的位置,所以它自己得死亡,这样树的节点总数才会少1 
            cout<<"the next node's to be deleted value is "<<dn->key<<" and its height is "<<dn->height<<endl;
            tree->right = avl_delete( tree->right, dn->key );
            //在tree->right(右子树)里递归得删除值为dn->key的节点。
            //递归的边界就是,某个叶子节点替代了它上一层里需要被删除的节点位置,然后这个叶子节点由于没有替死鬼,就只能被宰割(在最近的下面的else里被杀死) 
        }else{  //when the node has no child(替死鬼)
            cout<<"the node's value before delete: "<<tree->key<<endl;
            free(tree);
            //the tree is empty now, no need to do any operation(子树已经递归解决完毕)
            cout<<"the node's value after  delete: "<<tree->key<<endl;
            return NULL;
        }       
    }

    //adjust the tree to balance state after deletion
    if( height( tree->left ) - height( tree->right ) == 2 ) {  //when the left subtree is too high
        if( height( tree->left->right ) - height( tree->right->right ) == 1 ) {  //LR model
            tree = leftRightRotate(tree);
        }
        else { //LL model
            tree = singleRightRotate(tree);
        }
    }else if( height( tree->right ) - height( tree->left ) == 2 ) {  //when the right subtree is too high
        if( height( tree->right->left ) - height( tree->left->left ) == 1 ) {  //RL model
            tree = rightLeftRotate(tree);
        }
        else { //RR model
            tree = singleLeftRotate(tree);
        }
    }else {
        //the tree is already balanced,nothing to do...
    }


    //recalculate the height of the tree.
    tree->height = maxh( height( tree->right ),height( tree->left ) ) + 1;


    return tree;

}


//5.按中序输出AVL树中节点值
void print(avltree &tree, bool out_prompt) {    
    if( true == out_prompt)  {  //输出提醒
        cout<<endl<<endl<<"All value in avl_tree's node by InOrderTraversal is:"<<endl; 
        out_prompt = false;
    }
    if( NULL == tree ) {
        return;
    }
    else {
        print(tree->left,false);
        cout<<tree->key<<" ";
        print(tree->right,false);
    }

}

void more_new_line() {
    cout<<endl<<endl<<endl;
}


int main() {

    avltree test = NULL;
    test = avl_insert( test,10 );
    test = avl_insert( test,1 );
    test = avl_insert( test,100 );
    test = avl_insert( test,3 );
    test = avl_insert( test,2 );

    more_new_line();
    print(test,true);
    more_new_line();

    cout<<endl<<endl<<"Delete 10"<<endl;        
    test = avl_delete( test, 10 );

    more_new_line();
    print(test,true);   
    more_new_line();

    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值