// // Bistree.h // Algorithms&Data_structures // // Created by TTc on 15-2-4. // Copyright (c) 2015年 TTc. All rights reserved. // #ifndef __Algorithms_Data_structures__Bistree__ #define __Algorithms_Data_structures__Bistree__ #include <stdlib.h> #include "BiTree.h" /*定义平衡因子为AVL树*/ #define AVL_LFT_HEAVY 1 #define AVL_BALANCED 0 #define AVL_RGT_HEAVY -1 /*定义AVL树的节点*/ typedef struct AvlNode_{ void *data; int hidden; int factor;//平衡因子 }AvlNode; typedef BiTree BisTree; /*函数接口*/ void bistree_init (BisTree *tree, int (*compare)(const void *key1,const void *key2),void (*destroy)(void *data)); void bistree_destory(BisTree *tree); int bistree_insert(BisTree *tree,const void *data); int bistree_remove(BisTree * tree, const void * data); int bistree_lookup(const BisTree *tree,void **data); #define bistree_size(tree) ((tree)->size) #endif /* defined(__Algorithms_Data_structures__Bistree__) */
// // Bistree.c // Algorithms&Data_structures // // Created by TTc on 15-2-4. // Copyright (c) 2015年 TTc. All rights reserved. // #include "Bistree.h" #include <stdlib.h> #include <string.h> static void destroy_right(BisTree *tree,BiTreeNode*node); /* AVL 左旋操作 */ static void rotate_left(BiTreeNode **node){ BiTreeNode *left , *grandchild; left = bitree_right(*node); if (((AvlNode *)bitree_data(left)) ->factor == AVL_RGT_HEAVY){ /* RR */ bitree_right(*node) = bitree_left(left); bitree_left(left) = *node; ((AvlNode *)bitree_data(*node))->factor = AVL_BALANCED; ((AvlNode *)bitree_data(left)) ->factor = AVL_BALANCED; *node = left; } else { /*RL*/ grandchild = bitree_right(left); bitree_right(left) = bitree_left(grandchild); bitree_left(grandchild) = left; bitree_left(*node) = bitree_right(grandchild); bitree_right(grandchild) = *node; switch (((AvlNode *)bitree_data(grandchild)) ->factor){ case AVL_LFT_HEAVY: ((AvlNode *)bitree_data(*node)) ->factor = AVL_RGT_HEAVY; ((AvlNode *)bitree_data(left)) ->factor = AVL_BALANCED; break; case AVL_BALANCED: ((AvlNode *)bitree_data(*node)) ->factor = AVL_BALANCED; ((AvlNode *)bitree_data(left)) ->factor = AVL_BALANCED; break; case AVL_RGT_HEAVY: ((AvlNode *)bitree_data(*node)) ->factor = AVL_BALANCED; ((AvlNode *)bitree_data(left)) ->factor = AVL_LFT_HEAVY; break; } ((AvlNode *)bitree_data(grandchild)) ->factor = AVL_BALANCED; *node = grandchild; } return; } /* AVL 右旋操作 */ static void rotata_right(BiTreeNode **node){ BiTreeNode *right , *grandchild; right = bitree_left(*node); if (((AvlNode *)bitree_data(right)) ->factor == AVL_LFT_HEAVY){ /* LL */ bitree_right(*node) = bitree_left(right); bitree_left(right) = *node; ((AvlNode *)bitree_data(*node))->factor = AVL_BALANCED; ((AvlNode *)bitree_data(right)) ->factor = AVL_BALANCED; *node = right; } else { /*LR*/ grandchild = bitree_left(right); bitree_left(right) = bitree_right(grandchild); bitree_right(grandchild) = right; bitree_right(*node) = bitree_left(grandchild); bitree_left(grandchild) = *node; switch (((AvlNode *)bitree_data(grandchild)) ->factor){ case AVL_LFT_HEAVY: ((AvlNode *)bitree_data(*node)) ->factor = AVL_BALANCED; ((AvlNode *)bitree_data(right)) ->factor = AVL_RGT_HEAVY; break; case AVL_BALANCED: ((AvlNode *)bitree_data(*node)) ->factor = AVL_BALANCED; ((AvlNode *)bitree_data(right)) ->factor = AVL_BALANCED; break; case AVL_RGT_HEAVY: ((AvlNode *)bitree_data(*node)) ->factor = AVL_LFT_HEAVY; ((AvlNode *)bitree_data(right)) ->factor = AVL_BALANCED; break; } ((AvlNode *)bitree_data(grandchild)) ->factor = AVL_BALANCED; *node = grandchild; } return; } /*删除当前节点的左子树 * 如过参数node为NULL,表示删除所有节点 */ static void destroy_left (BisTree * tree, BiTreeNode * node){ BiTreeNode ** position; /*当树为空时,直接返回*/ if (bistree_size(tree) == 0){ return; } /*当删除节点为NULL时,当前位置指向树根 否则,指向当前节点的左子树*/ if (node == NULL){ position = &tree->root; } else { position = &node->left; } /*删除节点*/ if (*position != NULL){ destroy_left(tree,*position); destroy_right(tree, *position); if (tree->destroy != NULL){ tree->destroy(((AvlNode *)(*position)->data)->data); } free ((*position)->data); free(*position); *position = NULL; tree->size --; } return ; } /*删除节点的右子树 *如果节点为NULL,删除整个树 */ static void destroy_right(BisTree * tree, BiTreeNode * node){ BiTreeNode ** position; /*当树为空时,直接返回*/ if (bistree_size(tree) == 0){ return; } /*当删除节点为NULL时,当前位置指向树根 否则,指向当前节点的左子树*/ if (node == NULL){ position = &tree->root; } else { position = &node->right; } /*删除节点*/ if (*position != NULL){ destroy_left(tree,*position); destroy_right(tree, *position); if (tree->destroy != NULL){ tree->destroy(((AvlNode *)(*position)->data)->data); } free ((*position)->data); free(*position); *position = NULL; tree->size --; } return ; } static int insert(BisTree *tree,BiTreeNode **node,const void *data,int *balanced){ AvlNode *avl_data; int cmpval,retval; /* Insert the data into the tree */ if (bitree_is_eob(*node)){/*插入到根节点*/ /*申请空间,并赋值*/ if ((avl_data = (AvlNode *)malloc(sizeof(AvlNode))) == NULL) return -1; avl_data ->factor = AVL_BALANCED; avl_data ->hidden = 0; avl_data -> data = (void *) data; return bitree_ins_left(tree, * node, avl_data); } else { /*插入不为空的情况*/ /*比较插入数值与节点数值大小*/ cmpval = tree->compare(data,((AvlNode*)bitree_data(*node))->data); if (cmpval < 0){ /*插入数值小于节点数值时,插入左子树*/ if (bitree_is_eob(bitree_left(*node))){ /*当插入节点左子树为空时,直接插入并且树平衡*/ if ((avl_data = (AvlNode *) malloc(sizeof(AvlNode))) == NULL) return -1; avl_data ->factor = AVL_BALANCED; avl_data ->hidden = 0; avl_data -> data = (void *) data; *balanced = 0; return bitree_ins_left(tree, * node, avl_data); } else { /*当不为空时,继续判断*/ if ((retval = insert( tree, &bitree_left(*node), data, balanced)) != 0) return retval; } /*确保树的平衡*/ if (!(*balanced)){ switch (((AvlNode *)bitree_data(*node))->factor){ case AVL_LFT_HEAVY: rotata_right(node); *balanced = 1; break; case AVL_BALANCED: ((AvlNode*)bitree_data(*node)) -> factor = AVL_LFT_HEAVY; break; case AVL_RGT_HEAVY: ((AvlNode*)bitree_data(*node)) -> factor = AVL_BALANCED; *balanced = 1; break; } } }else if (cmpval > 0){ /*插入右子树*/ if (bitree_is_eob(bitree_right(*node))){ if ((avl_data = (AvlNode *) malloc(sizeof(AvlNode))) == NULL) return -1; avl_data ->factor = AVL_BALANCED; avl_data ->hidden = 0; avl_data -> data = (void *) data; *balanced = 0; return bitree_ins_right(tree, * node, avl_data); } else {/*节点不为空时,继续插入*/ if ((retval = insert( tree, &bitree_right(*node), data, balanced)) != 0) return retval; } /*确保树的平衡*/ if (!(*balanced)){ switch (((AvlNode *)bitree_data(*node))->factor){ case AVL_RGT_HEAVY: rotata_right(node); *balanced = 1; break; case AVL_BALANCED: ((AvlNode*)bitree_data(*node))->factor = AVL_RGT_HEAVY; break; case AVL_LFT_HEAVY: ((AvlNode*)bitree_data(*node))->factor = AVL_BALANCED; *balanced = 1; break; } } } else { /*cmpval = 0*/ /*插入数据相同*/ if (!((AvlNode *)bitree_data(*node))->hidden){ return 1; } else { /*将替换掉原来的数值*/ if (tree ->destroy != NULL){ tree ->destroy(((AvlNode*)bitree_data(*node)) ->data); } ((AvlNode*)bitree_data(*node)) -> data = (void *)data; ((AvlNode*)bitree_data(*node)) ->hidden = 0; *balanced = 1; } } } return 0; } static int hide(BisTree *tree, BiTreeNode *node, const void *data){ int cmpval,retval; if (bitree_is_eob(node)){ return -1; } cmpval = tree->compare(data,((AvlNode*)bitree_data(node))->data); if (cmpval < 0 ){/*去左子树查找*/ retval = hide(tree, bitree_left(node),data); } else if (cmpval > 0){ retval = hide( tree, bitree_right(node), data); } else { /*设置为隐藏*/ ((AvlNode *)bitree_data(node))->hidden = 1; retval = 0; } return retval; } /*查找数据*/ int look_up(BisTree *tree, BiTreeNode *node, void **data){ int cmpval,retval; if (bitree_is_eob(node)) return -1; cmpval = tree->compare(data,((AvlNode*)bitree_data(node))->data); if (cmpval < 0 ){/*去左子树查找*/ retval = look_up(tree, bitree_left(node),data); } else if (cmpval > 0){ retval = look_up( tree, bitree_right(node), data); } else { if (!((AvlNode *)bitree_data(node))->hidden ){ *data = ((AvlNode *)bitree_data(node))->data; retval =0; } else { return -1; } } return retval; } /*初始化AVL*/ //O(1) void bistree_init(BisTree * tree, int(* compare)(const void * key1, const void * key2), void(* destroy)(void * data)){ bitree_init(tree, destroy); tree->compare = compare; } //O(n) void bistree_destory(BisTree *tree){ /*删除所有节点*/ destroy_left( tree, NULL); memset(tree,0,sizeof(BisTree)); } /*插入数据 * 返回值: * 0: 成功 * 1: 插入数据已经存在树中 * -1: 失败 *O(lg n) */ int bistree_insert(BisTree *tree,const void *data){ /*balance 作用是设置一个标志位用来对二叉树的 *左右旋操作及设置factor的数值 * 0:表示不平衡,需要重新设置 * 1:则正好相反。 */ int balance = 0; return insert(tree,&bitree_root(tree),data,&balance); } /*删除数据 * 原则上并未删除这个节点,只是将节点标志设置 * 为隐藏。 * 返回值: * 0: 成功 * -1: 失败 *O(lg n) */ int bistree_remove(BisTree * tree, const void * data){ return hide (tree,bitree_root(tree),data); } /*查询参数tree所指向的二叉搜索树重是否存在数据同参数data相吻合的节点 * 如果查找成功,则函数返回后参数data指向查找到的节点的数据。 * 返回值: * 0: 成功 * -1: 失败 *O(lg n) */ int bistree_lookup(const BisTree *tree,void **data){ return look_up(tree, NULL, data); }