平衡二叉树的实现c语言
- 格式:doc
- 大小:36.88 KB
- 文档页数:5
平衡二叉树的实现c语言
平衡二叉树(AVL树)是一种自平衡的二叉查找树,其中任何节点的两个子树的高度差最多为1。下面是一个简单的AVL树的C语言实现:
```c
include <>
include <>
typedef struct AVLNode {
int key;
int height;
struct AVLNode left, right;
} AVLNode;
typedef struct {
AVLNode root;
} AVLTree;
int getHeight(AVLNode node) { if (node == NULL)
return 0;
return node->height;
}
int getBalance(AVLNode node) {
if (node == NULL)
return 0;
return getHeight(node->left) - getHeight(node->right);
}
AVLNode rotateRight(AVLNode y) {
AVLNode x = y->left;
AVLNode T2 = x->right;
x->right = y;
y->left = T2;
y->height = max(getHeight(y->left), getHeight(y->right)) + 1;
x->height = max(getHeight(x->left), getHeight(x->right)) + 1;
return x; // new root is x
}
AVLNode rotateLeft(AVLNode x) {
AVLNode y = x->right;
AVLNode T2 = y->left;
y->left = x;
x->right = T2;
x->height = max(getHeight(x->left), getHeight(x->right)) + 1;
y->height = max(getHeight(y->left), getHeight(y->right)) + 1;
return y; // new root is y
}
AVLNode insert(AVLTree tree, int key) {
AVLNode root = tree->root;
if (root == NULL) { // tree is empty, create a new node as root.
tree->root = (AVLNode)malloc(sizeof(AVLNode));
root = tree->root;
root->key = key;
root->height = 1;
return root;
} else if (key < root->key) { // insert into left subtree.
root->left = insert(root->left, key);
} else if (key > root->key) { // insert into right subtree. root->right = insert(root->right, key);
} else { // duplicate keys not allowed.
return root; // don't insert duplicate key.
}
root->height = 1 + max(getHeight(root->left), getHeight(root->right)); // adjust height of current node.
int balance = getBalance(root);
if (balance > 1 && key < root->left->key) { // left left case.
return rotateRight(root); // rotate right.
} else if (balance < -1 && key > root->right->key) { // right right
case.
return rotateLeft(root); // rotate left.
} else if (balance > 1 && key > root->left->key) { // left right case.
root->left = rotateLeft(root->left); // rotate left first.
return rotateRight(root); // then rotate right.
} else if (balance < -1 && key < root->right->key) { // right left
case.
root->right = rotateRight(root->right); // rotate right first.
return rotateLeft(root); // then rotate left.
} // keep balance.
return root; // already balanced. }
```