环境
$ cat /proc/version
Linux version 6.8.0-45-generic (buildd@lcy02-amd64-115) (x86_64-linux-gnu-gcc-13 (Ubuntu 13.2.0-23ubuntu4) 13.2.0, GNU ld (GNU Binutils for Ubuntu) 2.42) #45-Ubuntu SMP PREEMPT_DYNAMIC Fri Aug 30 12:02:04 UTC 2024
#include <stdio.h>
#include <stdlib.h>
struct node
{
int key;
int height;
struct node *left;
struct node *right;
};
int height(struct node *node)
{
if(node == NULL)
{
return 0;
}
return node->height;
}
int max(int a, int b)
{
return a > b ? a : b;
}
struct node *leftRotate(struct node *node)
{
/*
1
\
3
/
2
3
/
1
\
2
*/
struct node *root = node->right;
node->right = root->left;
root->left = node;
node->height = max(height(node->left), height(node->right));
root->height = max(height(root->left), height(root->right));
return root;
}
struct node *rightRotate(struct node *node)
{
struct node *root = node->left;
node->left = root->right;
root->right = node;
node->height = max(height(node->left), height(node->right));
root->height = max(height(root->left), height(root->right));
return root;
}
struct node *insertNode(struct node *root, int key)
{
#if 0
if(root == NULL)
{
root = malloc(sizeof(*root));
root->key = key;
root->height = 1;
root->left = NULL;
root->right = NULL;
return root;
}
if(key < root->key)
{
root->left = insertNode(root->left, key);
}
else if(key > root->key)
{
root->right = insertNode(root->right, key);
}
else
{
return root;
}
#else
struct node **tmp = &root;
while(1)
{
if((*tmp) == NULL)
{
(*tmp) = malloc(sizeof(*root));
(*tmp)->key = key;
(*tmp)->height = 1;
(*tmp)->left = NULL;
(*tmp)->right = NULL;
break;
}
else if(key < (*tmp)->key)
{
tmp = &(*tmp)->left;
}
else if(key > (*tmp)->key)
{
tmp = &(*tmp)->right;
}
else
{
return root;
}
}
#endif
root->height = max(height(root->left), height(root->right));
int bf = height(root->left) - height(root->right);
/*
3
/
2
/
1
*/
if(bf > 1 && key < root->left->key)
{
return rightRotate(root);
}
else if(bf < -1 && key > root->right->key)
{
return leftRotate(root);
}
/*
3
/
1
\
2
*/
else if(bf > 1 && key > root->left->key)
{
root->left = leftRotate(root->left);
return rightRotate(root);
}
else if(bf < -1 && key < root->right->key)
{
root->right = rightRotate(root->right);
return leftRotate(root);
}
else
{}
return root;
}
void inOrder(struct node *node)
{
if(node == NULL)
{
return;
}
inOrder(node->left);
printf("%d ", node->key);
inOrder(node->right);
}
int main(int argc, char *argv[])
{
struct node *root = NULL;
root = insertNode(root, 0);
root = insertNode(root, 1);
/*
0
\
1
*/
root = insertNode(root, 3);
/*
0 0 1
\ \ / \
1 1 0 3
\
3
*/
root = insertNode(root, 9);
/*
0 0 1 1
\ \ / \ / \
1 1 0 3 0 3
\ \
3 9
*/
root = insertNode(root, 2);
/*
0 0 1 1 1
\ \ / \ / \ / \
1 1 0 3 0 3 0 3
\ \ / \
3 9 2 9
*/
root = insertNode(root, 8);
/*
0 0 1 1 1 1 1 3
\ \ / \ / \ / \ / \ / \ / \
1 1 0 3 0 3 0 3 0 3 0 3 1 8
\ \ / \ / \ / \ / \ \
3 9 2 9 2 9 2 8 0 2 9
/ \
8 9
*/
inOrder(root);
printf("\n");
return 0;
}
<完>