您的位置:首页 > 其它

AVL树的插入(暂无删除)

2013-09-25 16:47 211 查看
#include <stdio.h>
#include <stdlib.h>

#define max(x, y)       (((x) > (y)) ? (x) : (y))

typedef struct node
{
int           id;
int           h; // height
struct node   *left;
struct node   *right;
} node;

static node *findmin(node *root)
{
if (root == NULL)
return (NULL);

if (root->left == NULL)
return (root);
else
return (findmin(root->left));
}

static int height(node *root)
{
if (root == NULL)
return (-1);
else
return root->h;
}

static node *single_rotate_right(node *k2)
{
node  *k1 = k2->left;

k2->left = k1->right;
k1->right = k2;

k2->h = max(height(k2->left), height(k2->right)) + 1;
k1->h = max(height(k1->left), height(k1->right)) + 1;

return (k1);
}

static node *single_rotate_left(node *k2)
{
node  *k1 = k2->right;

k2->right = k1->left;
k1->left = k2;

k2->h = max(height(k2->left), height(k2->right)) + 1;
k1->h = max(height(k1->left), height(k1->right)) + 1;

return (k1);
}

static node *right_left(node *k3)
{
k3->right = single_rotate_right(k3->right);
return (single_rotate_left(k3));
}

static node *left_right(node *k3)
{
k3->left = single_rotate_left(k3->left);
return (single_rotate_right(k3));
}

node *insert(int id, node *root)
{
if (root == NULL)
{
root = malloc(sizeof(node));
if (root == NULL)
{
printf("out of memory\n");
return (NULL);
}
root->id = id;
root->h = 0;
root->left = root->right = NULL;
}
else if (id < root->id)
{
root->left = insert(id, root->left);
if (height(root->left) - height(root->right) == 2)
{
if (id < root->left->id)
root = single_rotate_right(root);
else
root = left_right(root);
}
}
else if(id > root->id)
{
root->right = insert(id, root->right);
if (height(root->right) - height(root->left) == 2)
{
if (id < root->right->id)
root = right_left(root);
else
root = single_rotate_left(root);
}
}

root->h = max(height(root->left), height(root->right)) + 1;
return (root);
}


这是一种方法:每个节点包含该节点的高度。这种方法比较简单。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: