c 平衡二叉树创建
时间: 2023-11-06 07:03:30 浏览: 174
平衡二叉树的创建过程如下:
1. 首先,按照创建二叉排序树的方法,找到结点的插入位置,并将结点插入二叉树中。
2. 然后,计算插入结点的父结点的平衡因子。如果平衡因子的绝对值大于1,说明该子树是不平衡的,需要对该子树进行调整,使其成为平衡二叉树。
3. 接着,逐层向上计算和调整平衡因子,直到达到根结点。即使根结点的平衡因子的绝对值也大于1,也要进行调整,以保证整棵树是平衡的。
4. 最后,重复以上操作,一个一个地将结点插入二叉树并进行调整,直到插入完成,创建出平衡二叉树。
相关问题
c语言创建平衡二叉树
以下是C语言创建平衡二叉树的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义平衡二叉树结点
typedef struct AVLNode {
int data; // 数据域
int height; // 结点高度
struct AVLNode *left; // 左子树指针
struct AVLNode *right; // 右子树指针
} AVLNode, *AVLTree;
// 获取结点高度
int getHeight(AVLTree T) {
if (T == NULL) {
return -1;
} else {
return T->height;
}
}
// 获取两个数中的最大值
int max(int a, int b) {
return a > b ? a : b;
}
// LL旋转
AVLTree LLRotation(AVLTree A) {
AVLTree B = A->left;
A->left = B->right;
B->right = A;
A->height = max(getHeight(A->left), getHeight(A->right)) + 1;
B->height = max(getHeight(B->left), A->height) + 1;
return B;
}
// RR旋转
AVLTree RRRotation(AVLTree A) {
AVLTree B = A->right;
A->right = B->left;
B->left = A;
A->height = max(getHeight(A->left), getHeight(A->right)) + 1;
B->height = max(getHeight(B->right), A->height) + 1;
return B;
}
// LR旋转
AVLTree LRRotation(AVLTree A) {
A->left = RRRotation(A->left);
return LLRotation(A);
}
// RL旋转
AVLTree RLRotation(AVLTree A) {
A->right = LLRotation(A->right);
return RRRotation(A);
}
// 插入结点
AVLTree insert(AVLTree T, int data) {
if (T == NULL) {
T = (AVLTree)malloc(sizeof(AVLNode));
T->data = data;
T->height = 0;
T->left = T->right = NULL;
} else if (data < T->data) {
T->left = insert(T->left, data);
if (getHeight(T->left) - getHeight(T->right) == 2) {
if (data < T->left->data) {
T = LLRotation(T);
} else {
T = LRRotation(T);
}
}
} else if (data > T->data) {
T->right = insert(T->right, data);
if (getHeight(T->right) - getHeight(T->left) == 2) {
if (data > T->right->data) {
T = RRRotation(T);
} else {
T = RLRotation(T);
}
}
}
T->height = max(getHeight(T->left), getHeight(T->right)) + 1;
return T;
}
// 中序遍历
void inorderTraversal(AVLTree T) {
if (T != NULL) {
inorderTraversal(T->left);
printf("%d ", T->data);
inorderTraversal(T->right);
}
}
int main() {
AVLTree T = NULL;
int arr[] = {3, 2, 1, 4, 5, 6, 7, 10, 9, 8};
int len = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < len; i++) {
T = insert(T, arr[i]);
}
inorderTraversal(T); // 输出:1 2 3 4 5 6 7 8 9 10
return 0;
}
```
平衡二叉树的实现c语言
平衡二叉树的实现可以使用C语言来完成。下面是一个简单的平衡二叉树的实现示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构
struct Node {
int data;
struct Node* left;
struct Node* right;
int height;
};
// 获取节点的高度
int getHeight(struct Node* node) {
if (node == NULL) {
return 0;
}
return node->height;
}
// 获取两个数中的较大值
int max(int a, int b) {
return (a > b) ? a : b;
}
// 创建一个新的节点
struct Node* createNode(int data) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
newNode->height = 1;
return newNode;
}
// 右旋操作
struct Node* rightRotate(struct Node* y) {
struct Node* x = y->left;
struct Node* 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;
}
// 左旋操作
struct Node* leftRotate(struct Node* x) {
struct Node* y = x->right;
struct Node* 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;
}
// 获取节点的平衡因子
int getBalanceFactor(struct Node* node) {
if (node == NULL) {
return 0;
}
return getHeight(node->left) - getHeight(node->right);
}
// 插入节点
struct Node* insertNode(struct Node* node, int data) {
// 执行标准的BST插入
if (node == NULL) {
return createNode(data);
}
if (data < node->data) {
node->left = insertNode(node->left, data);
} else if (data > node->data) {
node->right = insertNode(node->right, data);
} else {
return node; // 如果节点已经存在,则直接返回
}
// 更新节点的高度
node->height = 1 + max(getHeight(node->left), getHeight(node->right));
// 获取节点的平衡因子
int balanceFactor = getBalanceFactor(node);
// 如果节点不平衡,根据平衡因子进行旋转操作
// 左左情况
if (balanceFactor > 1 && data < node->left->data) {
return rightRotate(node);
}
// 右右情况
if (balanceFactor < -1 && data > node->right->data) {
return leftRotate(node);
}
// 左右情况
if (balanceFactor > 1 && data > node->left->data) {
node->left = leftRotate(node->left);
return rightRotate(node);
}
// 右左情况
if (balanceFactor < -1 && data < node->right->data) {
node->right = rightRotate(node->right);
return leftRotate(node);
}
return node;
}
// 中序遍历二叉树
void inorderTraversal(struct Node* root) {
if (root != NULL) {
inorderTraversal(root->left);
printf("%d ", root->data);
inorderTraversal(root->right);
}
}
int main() {
struct Node* root = NULL;
// 插入节点
root = insertNode(root, 10);
root = insertNode(root, 20);
root = insertNode(root, 30);
root = insertNode(root, 40);
root = insertNode(root, 50);
root = insertNode(root, 25);
// 中序遍历二叉树
printf("Inorder traversal of the AVL tree: ");
inorderTraversal(root);
printf("\n");
return 0;
}
```
这个示例代码实现了一个简单的平衡二叉树,包括节点的插入操作和中序遍历操作。你可以根据需要进行修改和扩展。