#include<stdio.h> #include<stdlib.h> #define HEIGHT(node) (node==NULL)?0:((avlnode*)(node)->height) #define MAX(a,b) ((a)>(b)?(a):(b)) typedef struct Node { int key; struct Node* left; struct Node* right; int height; }avlnode, * avltree;
avltree left_left_rotation(avltree tree) { avlnode* k2 = tree->left; tree->left = k2->right; k2->right = tree; tree->height = MAX(getNode_height(tree->left), getNode_height(tree->right)) + 1; k2->height = MAX(getNode_height(tree->left), getNode_height(tree->right)) + 1; return k2; }
avltree right_right_rotation(avltree tree) { avlnode* k2 = tree->right; tree->right = k2->left; k2->left = tree; tree->height = MAX(getNode_height(tree->left), getNode_height(tree->right)) + 1; k2->height = MAX(getNode_height(tree->left), getNode_height(tree->right)) + 1; return k2; }
avltree left_right_rotation(avltree tree) { tree->left = right_right_rotation(tree->left); tree = left_left_rotation(tree); return tree; }
avltree right_left_rotation(avltree tree) { tree->right = left_left_rotation(tree->right); tree = right_right_rotation(tree); return tree; }
avltree insert(avltree tree, int key) { if (tree == NULL) { avlnode* node = create_node(key, NULL, NULL); tree = node; } else if (key < tree->key) { tree->left = insert(tree->left, key); if (HEIGHT(tree->left) - HEIGHT(tree->right) == 2) { if (key < tree->left->key) { tree = left_left_rotation(tree); } else { tree = left_right_rotation(tree); } } } else { tree->right = insert(tree->right, key); if (HEIGHT(tree->right) - HEIGHT(tree->left) == 2) { if (key < tree->right->key) { tree = right_left_rotation(tree); } else { tree = right_right_rotation(tree); } } }
tree->height = MAX(getNode_height(tree->left), getNode_height(tree->right)) + 1;
return tree; }
avlnode* create_node(int key, avlnode* left, avlnode* right) { avlnode* node = (avlnode*)malloc(sizeof(avlnode)); node->key = key; node->left = left; node->right = right; node->height = 0; return node; }
int getNode_height(avlnode* node) { return HEIGHT(node); }
avlnode* search_node(avltree tree, int key) { if (tree == NULL || key == tree->key) { return tree; } else if (key < tree->key) { search_node(tree->left, key); } else { search_node(tree->right, key); } }
avlnode* minimun(avltree tree) { if (tree == NULL) { return NULL; } else { while (tree->right) { tree = tree->right; } } return tree; }
avlnode* avltree_deleteNode(avltree tree, int key) { avlnode* node = search_node(tree, key); if (node == NULL || tree == NULL) { return tree; } else { if (key < tree->key) { tree->left = avltree_deleteNode(tree->left, key); if (HEIGHT(tree->right) - HEIGHT(tree->left) == 2) { if (tree->right->left) { tree = right_left_rotation(tree); } else { tree = right_right_rotation(tree); } } } else if(key > tree->key) { tree->right = avltree_deleteNode(tree->right, key); if (HEIGHT(tree->left) - HEIGHT(tree->right) == 2) { if (key < tree->left->key) { tree = left_left_rotation(tree); } else { tree = left_right_rotation(tree); } } } else { if (tree->left && tree->right) { avlnode* min_node = minimun(tree->left); tree->key = min_node->key; tree->left = avltree_deleteNode(tree->left, min_node->key); } else { tree = (tree->left ? tree->left : tree->right); } }
if (tree) { tree->height = MAX(getNode_height(tree->left), getNode_height(tree->right)) + 1; } }
return tree; }
|