原来我以前实现过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
- 原来我以前实现过AVL树
- 以前写的AVL树实现map练习
- 我实现的AVL树模版类
- 我以前是发过贴的
- 我的AVL树代码实现(欢迎测试)
- AVL树的实现
- AVL平衡树实现
- AVL树的实现
- AVL树递归实现
- AVL平衡树实现
- AVL树 实现代码
- AVL树的实现
- AVL树实现代码
- AVL 树的实现
- AVL树及其实现
- AVL树C实现
- AVL 树实现
- AVL树的实现
- NYOJ 50 爱摘苹果的小明
- unity3d Photon客户端 工作流程
- linux文件系统的组成和各部分的作用
- Windows Azure 安全最佳实践 - 第 1 部分:深度解析挑战防御对策
- poemel 端口作用
- 原来我以前实现过AVL树
- jquery 跨域POST信息问题解决方案
- a=b
- hdu2289Cup(神坑题,精度+二分,以半径二分不能过,以高度为二分就过了)
- MySQL表常用操作
- Hessian学习之(二):Hessian集成到Spring
- Jackson 框架使用教程,轻易转换JSON
- QPS、PV和需要部署机器数量计算公式
- 在CentOS中实现AP 初步小结