原来我以前实现过AVL树

来源:互联网 发布:星际穿越量子数据 编辑:程序博客网 时间:2024/04/29 16:39
// avltree_frame.h: avl树实现// author: e7, ryuuzaki.uchiha#gmail#com#ifndef __AVLTREE_FRAME_H__#define __AVLTREE_FRAME_H__#include "error_info.h"#ifdef __cplusplusextern "C" {#endiftypedef struct avltree_frame avltree_frame_t;struct avltree_frame {    int_t m_key; // 键    void *mp_value; // 值    int_t m_balance_factor; // 平衡因子    avltree_frame_t *mp_ftree; // 父树    avltree_frame_t *mp_ltree; // 左子树    avltree_frame_t *mp_rtree; // 右子树};#define AVLTREE_FRAME_NODE(name)         \            avltree_frame_node_t name = {0, 0, NULL, NULL, NULL}// ********** avl树的四种旋转 **********static inlinevoid avl_r_rotate(avltree_frame_t **pp_tree){    //        1 o                    2 o           //    //         / \                    / \          //    //      2 o   o 3              4 o   o 1       //    //       / \         -->        /   / \        //    //    4 o   o 5              6 o   o   o 3     //    //     /                           5           //    //  6 o                                        //    ASSERT(NULL != pp_tree);    ASSERT(NULL != (*pp_tree));    ASSERT(NULL != (*pp_tree)->mp_ltree);    // 旋转    do {        avltree_frame_t *p_father= (*pp_tree)->mp_ftree;        avltree_frame_t *p_old_root = (*pp_tree);        avltree_frame_t *p_new_root = (*pp_tree)->mp_ltree;        avltree_frame_t *p_child = (*pp_tree)->mp_ltree->mp_rtree;        // start ratate        p_old_root->mp_ftree = p_new_root;        (*pp_tree) = p_new_root;        p_new_root->mp_ftree = p_father;        p_old_root->mp_ltree = p_new_root->mp_rtree;        p_new_root->mp_rtree = p_old_root;        if (NULL != p_child) {            p_child->mp_ftree = p_old_root;        }        // 修正平衡因子        p_old_root->m_balance_factor            += MAX(0 - p_new_root->m_balance_factor, 0) + 1;        p_new_root->m_balance_factor            += MAX(0, p_old_root->m_balance_factor) + 1;    } while (0);    return;}static inlinevoid avl_l_rotate(avltree_frame_t **pp_tree){    ASSERT(NULL != pp_tree);    ASSERT(NULL != (*pp_tree));    ASSERT(NULL != (*pp_tree)->mp_rtree);    do {        avltree_frame_t *p_father= (*pp_tree)->mp_ftree;        avltree_frame_t *p_old_root = (*pp_tree);        avltree_frame_t *p_new_root = (*pp_tree)->mp_rtree;        avltree_frame_t *p_child = (*pp_tree)->mp_rtree->mp_ltree;        // start ratate        p_old_root->mp_ftree = p_new_root;        (*pp_tree) = p_new_root;        p_new_root->mp_ftree = p_father;        p_old_root->mp_rtree = p_new_root->mp_ltree;        p_new_root->mp_ltree = p_old_root;        if (NULL != p_child) {            p_child->mp_ftree = p_old_root;        }        // 修正平衡因子        p_old_root->m_balance_factor            -= MAX(0, p_new_root->m_balance_factor) + 1;        p_new_root->m_balance_factor            += MIN(p_old_root->m_balance_factor, 0) - 1;    } while (0);    return;}static inlinevoid avl_lr_rotate(avltree_frame_t **pp_tree){    ASSERT(NULL != pp_tree);    ASSERT(NULL != (*pp_tree));    ASSERT(ABS((*pp_tree)->m_balance_factor) > 1);    // 执行双旋转    avl_l_rotate(&((*pp_tree)->mp_ltree));    avl_r_rotate(pp_tree);    return;}static inlinevoid avl_rl_rotate(avltree_frame_t **pp_tree){    ASSERT(NULL != pp_tree);    ASSERT(NULL != (*pp_tree));    ASSERT(ABS((*pp_tree)->m_balance_factor) > 1);    // 执行双旋转    avl_r_rotate(&((*pp_tree)->mp_rtree));    avl_l_rotate(pp_tree);    return;}// ********** avl树的内部查找 **********typedef struct {    avltree_frame_t **mpp_father;    avltree_frame_t **mpp_child;} avl_iter_t; // 上滤迭代器// 寻找左子树的最大值static inlineavl_iter_t *find_lmax_avltree_frame(avltree_frame_t **pp_tree,                                    avl_iter_t *p_iter){    ASSERT(NULL != pp_tree);    // 开始寻找    ASSERT(NULL != *pp_tree);    ASSERT(NULL != (*pp_tree)->mp_ltree); // 存在左子树    p_iter->mpp_father = pp_tree;    p_iter->mpp_child = &(*pp_tree)->mp_ltree;    while (NULL != (*p_iter->mpp_child)->mp_rtree) {        p_iter->mpp_father = p_iter->mpp_child;        p_iter->mpp_child = &(*p_iter->mpp_child)->mp_rtree;    }    return p_iter;}// 寻找右子树的最小值static inlineavl_iter_t *find_rmin_avltree_frame(avltree_frame_t **pp_tree,                                    avl_iter_t *p_iter){    ASSERT(NULL != pp_tree);    // 开始寻找    ASSERT(NULL != *pp_tree);    ASSERT(NULL != (*pp_tree)->mp_rtree); // 存在右子树    p_iter->mpp_father = pp_tree;    p_iter->mpp_child = &(*pp_tree)->mp_rtree;    while (NULL != (*p_iter->mpp_child)->mp_ltree) {        p_iter->mpp_father = p_iter->mpp_child;        p_iter->mpp_child = &(*p_iter->mpp_child)->mp_ltree;    }    return p_iter;}// ********** avl树接口 **********static inlinevoid init_avltree_frame(avltree_frame_t *p_tree, int_t key){    ASSERT(NULL != p_tree);    p_tree->m_key = key;    p_tree->mp_value = NULL;    p_tree->m_balance_factor = 0;    p_tree->mp_ftree = NULL;    p_tree->mp_ltree = NULL;    p_tree->mp_rtree = NULL;}static inlineint_t insert_avltree_frame(avltree_frame_t **pp_tree,                           avltree_frame_t *p_subtree){    int_t rslt = 0;    avltree_frame_t **pp_orig = NULL; // 树根指针真身    avltree_frame_t **pp_vacancy = NULL; //待插位置    avltree_frame_t *p_child_tree = NULL;    // 参数检查    ASSERT(NULL != pp_tree);    ASSERT(NULL != p_subtree);    ASSERT(0 == p_subtree->m_balance_factor);    ASSERT((NULL == p_subtree->mp_ltree) && (NULL == p_subtree->mp_rtree));    // 寻找插入位置    pp_vacancy = pp_tree;    pp_orig = pp_tree;    while (NULL != *pp_vacancy) {        pp_orig = pp_vacancy;        if ((*pp_vacancy)->m_key > p_subtree->m_key) {            pp_vacancy = &(*pp_vacancy)->mp_ltree;        } else if ((*pp_vacancy)->m_key < p_subtree->m_key) {            pp_vacancy = &(*pp_vacancy)->mp_rtree;        } else {            break;        }    }    if (NULL != *pp_vacancy) { // 已存在        rslt = -E_EXISTED;        goto FINAL;    }    // 执行插入    p_subtree->mp_ftree = (*pp_orig);    (*pp_vacancy) = p_subtree;    // 调整    p_child_tree = p_subtree;    while(NULL != (*pp_orig)) {        if (p_child_tree == (*pp_orig)->mp_ltree) {            --((*pp_orig)->m_balance_factor);        } else if (p_child_tree == (*pp_orig)->mp_rtree) {            ++((*pp_orig)->m_balance_factor);        } else {            ASSERT(p_child_tree == (*pp_orig));            break;        }        if ((*pp_orig)->m_balance_factor < -1) {            if ((*pp_orig)->mp_ltree->m_balance_factor < 0) {                avl_r_rotate(pp_orig);                // 断言平衡因子                ASSERT(ABS((*pp_orig)->m_balance_factor) <= 1);                ASSERT(ABS((*pp_orig)->mp_rtree->m_balance_factor) <= 1);            } else if ((*pp_orig)->mp_ltree->m_balance_factor > 0) {                avl_lr_rotate(pp_orig);                // 断言平衡因子                ASSERT(ABS((*pp_orig)->m_balance_factor) <= 1);                ASSERT(ABS((*pp_orig)->mp_ltree->m_balance_factor) <= 1);                ASSERT(ABS((*pp_orig)->mp_rtree->m_balance_factor) <= 1);            } else {                ASSERT(0);            }            break;        } else if ((*pp_orig)->m_balance_factor > 1) {            if ((*pp_orig)->mp_rtree->m_balance_factor > 0) {                avl_l_rotate(pp_orig);                // 断言平衡因子                ASSERT(ABS((*pp_orig)->m_balance_factor) <= 1);                ASSERT(ABS((*pp_orig)->mp_ltree->m_balance_factor) <= 1);            } else if ((*pp_orig)->mp_rtree->m_balance_factor < 0) {                avl_rl_rotate(pp_orig);                // 断言平衡因子                ASSERT(ABS((*pp_orig)->m_balance_factor) <= 1);                ASSERT(ABS((*pp_orig)->mp_ltree->m_balance_factor) <= 1);                ASSERT(ABS((*pp_orig)->mp_rtree->m_balance_factor) <= 1);            } else {                ASSERT(0);            }            break;        } else if (0 == (*pp_orig)->m_balance_factor) {            break;        } else {            p_child_tree = (*pp_orig);            if (NULL == (*pp_orig)->mp_ftree) {                break;            }            if (NULL == (*pp_orig)->mp_ftree->mp_ftree) {                pp_orig = pp_tree;            } else if ((*pp_orig)->mp_ftree                           == (*pp_orig)->mp_ftree->mp_ftree->mp_ltree)            {                pp_orig = &((*pp_orig)->mp_ftree->mp_ftree->mp_ltree);            } else if ((*pp_orig)->mp_ftree                           == (*pp_orig)->mp_ftree->mp_ftree->mp_rtree)            {                pp_orig = &((*pp_orig)->mp_ftree->mp_ftree->mp_rtree);            } else {                ASSERT(0);            }        }    }FINAL:    return rslt;}static inlineavl_iter_t *find_avltree_frame(avltree_frame_t **pp_tree,                               int_t key,                               avl_iter_t *p_iter){    ASSERT(NULL != pp_tree);    ASSERT(NULL != p_iter);    ASSERT(NULL != *pp_tree);    p_iter->mpp_father = NULL;    p_iter->mpp_child = pp_tree;    while (key != (*p_iter->mpp_child)->m_key) {        if ((*p_iter->mpp_child)->m_key < key) {            p_iter->mpp_father = p_iter->mpp_child;            p_iter->mpp_child = &(*p_iter->mpp_child)->mp_rtree;        } else if ((*p_iter->mpp_child)->m_key > key) {            p_iter->mpp_father = p_iter->mpp_child;            p_iter->mpp_child = &(*p_iter->mpp_child)->mp_ltree;        } else {            ASSERT(0);        }        if (NULL == *p_iter->mpp_child) {            p_iter = NULL;            break;        }    }    return p_iter;}static inlineint_t remove_avltree_frame(avltree_frame_t **pp_tree, int_t key){    int_t rslt = 0;    avl_iter_t del = {        NULL, NULL,    };    avl_iter_t alternate = {        NULL, NULL,    };    avl_iter_t *p_del = NULL;    avltree_frame_t *p_assert = NULL;    ASSERT(NULL != pp_tree);    ASSERT(NULL != *pp_tree);    // 查找待删除的结点    p_del = find_avltree_frame(pp_tree, key, &del);    if (NULL == p_del) {        rslt = -E_NOT_EXIST;        goto FINAL;    }    // 迭代替换候补结点    while (TRUE) {        if (NULL != (*p_del->mpp_child)->mp_ltree) {            alternate.mpp_father = p_del->mpp_father;            alternate.mpp_child = p_del->mpp_child;            p_del = find_lmax_avltree_frame(p_del->mpp_child, &del);        } else if (NULL != (*p_del->mpp_child)->mp_rtree) {            alternate.mpp_father = p_del->mpp_father;            alternate.mpp_child = p_del->mpp_child;            p_del = find_rmin_avltree_frame(p_del->mpp_child, &del);        } else {            break;        }        // 交换结点核心数据        SWAP((*del.mpp_child)->m_key, (*alternate.mpp_child)->m_key); // 键        SWAP((*del.mpp_child)->mp_value,             (*alternate.mpp_child)->mp_value); // 值    }    p_assert = *p_del->mpp_child;    // ***** 上滤然后删除 *****    ASSERT(NULL == (*p_del->mpp_child)->mp_ltree);    ASSERT(NULL == (*p_del->mpp_child)->mp_rtree);    if (NULL == p_del->mpp_father) { // 该树只有一个结点        goto DELETE;    }    // 执行上滤    alternate.mpp_father = p_del->mpp_father;    alternate.mpp_child = p_del->mpp_child;    while (TRUE) {        if (0 == (*alternate.mpp_father)->m_balance_factor) {            // 不会引起父树高度变化,不必上滤            if ((*alternate.mpp_child) == (*alternate.mpp_father)->mp_ltree) {                ++(*alternate.mpp_father)->m_balance_factor;            } else if ((*alternate.mpp_child)                           == (*alternate.mpp_father)->mp_rtree)            {                --(*alternate.mpp_father)->m_balance_factor;            } else {                ASSERT(0);            }            break;        } else if (1 == (*alternate.mpp_father)->m_balance_factor) {            ASSERT(NULL != (*alternate.mpp_father)->mp_rtree);            if ((*alternate.mpp_child) == (*alternate.mpp_father)->mp_ltree) {                // 说明左子树高度有降                ++(*alternate.mpp_father)->m_balance_factor;                if ((*alternate.mpp_father)->mp_rtree->m_balance_factor < 0) {                    avl_rl_rotate(alternate.mpp_father);                } else if ((*alternate.mpp_father)->mp_rtree->m_balance_factor                               > 0)                {                    avl_l_rotate(alternate.mpp_father);                } else if (                    0 == (*alternate.mpp_father)->mp_rtree->m_balance_factor)                {                    avl_l_rotate(alternate.mpp_father);                    break;                } else {                    ASSERT(0);                }            } else {                --(*alternate.mpp_father)->m_balance_factor;            }            ASSERT(2 > ABS((*alternate.mpp_father)->m_balance_factor));        } else if (-1 == (*alternate.mpp_father)->m_balance_factor) {            ASSERT(NULL != (*alternate.mpp_father)->mp_ltree);            if ((*alternate.mpp_child) == (*alternate.mpp_father)->mp_rtree) {                // 说明右子树高度有降                --(*alternate.mpp_father)->m_balance_factor;                if ((*alternate.mpp_father)->mp_ltree->m_balance_factor > 0) {                    avl_lr_rotate(alternate.mpp_father);                } else if ((*alternate.mpp_father)->mp_ltree->m_balance_factor                               < 0)                {                    avl_r_rotate(alternate.mpp_father);                } else if (                    0 == (*alternate.mpp_father)->mp_ltree->m_balance_factor)                {                    avl_r_rotate(alternate.mpp_father);                    break;                } else {                    ASSERT(0);                }            } else {                ++(*alternate.mpp_father)->m_balance_factor;            }            ASSERT(2 > ABS((*alternate.mpp_father)->m_balance_factor));        } else {            assert(0);        }        alternate.mpp_child = alternate.mpp_father;        if (NULL == (*alternate.mpp_father)->mp_ftree) {            // 已上滤到根结点            ASSERT(alternate.mpp_father == pp_tree);            break;        }        if (NULL == (*alternate.mpp_father)->mp_ftree->mp_ftree) {            alternate.mpp_father = pp_tree;        } else if (            (*alternate.mpp_father)->mp_ftree                == (*alternate.mpp_father)->mp_ftree->mp_ftree->mp_ltree)        {            alternate.mpp_father                = &(*alternate.mpp_father)->mp_ftree->mp_ftree->mp_ltree;        } else if (            (*alternate.mpp_father)->mp_ftree                == (*alternate.mpp_father)->mp_ftree->mp_ftree->mp_rtree)        {            alternate.mpp_father                = &(*alternate.mpp_father)->mp_ftree->mp_ftree->mp_rtree;        } else {            ASSERT(0);        }    }DELETE:    ASSERT(p_assert == *p_del->mpp_child);    (*p_del->mpp_child)->mp_ftree = NULL;    *p_del->mpp_child = NULL;FINAL:    return rslt;}#ifdef __cplusplus}#endif // end of extern "C"#endif // __AVLTREE_FRAME_H_结点_


ps: 现在看来实现有点渣,不过性能高于stl::map,插1千万勉强与红黑树持平

0 0