你能用C++写一个由平衡因子实现二叉搜索树的代码吗
时间: 2023-09-03 07:25:37 浏览: 133
### 回答1:
当平衡因子被定义为左右子树高度之差时,这种平衡的二叉搜索树通常被称为AVL树。下面是一个用C语言实现的AVL树的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int key;
int height;
struct node* left;
struct node* right;
} node;
node* new_node(int key) {
node* n = (node*) malloc(sizeof(node));
n->key = key;
n->height = 1;
n->left = NULL;
n->right = NULL;
return n;
}
int max(int a, int b) {
return (a > b) ? a : b;
}
int height(node* n) {
if (n == NULL)
return 0;
return n->height;
}
int balance_factor(node* n) {
if (n == NULL)
return 0;
return height(n->left) - height(n->right);
}
node* rotate_right(node* n) {
node* left = n->left;
node* right = left->right;
left->right = n;
n->left = right;
n->height = max(height(n->left), height(n->right)) + 1;
left->height = max(height(left->left), height(left->right)) + 1;
return left;
}
node* rotate_left(node* n) {
node* right = n->right;
node* left = right->left;
right->left = n;
n->right = left;
n->height = max(height(n->left), height(n->right)) + 1;
right->height = max(height(right->left), height(right->right)) + 1;
return right;
}
node* insert(node* root, int key) {
if (root == NULL)
return new_node(key);
if (key < root->key)
root->left = insert(root->left, key);
else if (key > root->key)
root->right = insert(root->right, key);
else
return root;
root->height = 1 + max(height(root->left), height(root->right));
int bf = balance_factor(root);
if (bf > 1 && key < root->left->key)
return rotate_right(root);
if (bf < -1 && key > root->right->key)
return rotate_left(root);
if (bf > 1 && key > root->left->key) {
root->left = rotate_left(root->left);
return rotate_right(root);
}
if (bf < -1 && key < root->right->key) {
root->right = rotate_right(root->right);
return rotate_left(root);
}
return root;
}
void inorder_traversal(node* root) {
if (root != NULL) {
inorder_traversal(root->left);
printf("%d ", root->key);
inorder_traversal(root->right);
}
}
int main() {
node* root = NULL;
root = insert(root, 10);
root = insert(root, 20);
root = insert(root, 30);
root = insert(root, 40);
root = insert(root, 50);
root = insert(root, 25);
printf("Inorder traversal of the AVL tree is: ");
inorder_traversal(root);
printf("\
### 回答2:
当然可以使用 C 语言编写一个由平衡因子实现二叉搜索树的代码。平衡二叉搜索树,即 AVL 树,是一种自平衡的二叉搜索树,它可以保证在最坏情况下的查询、插入和删除操作的时间复杂度为 O(log n)。
以下是一个用 C 语言实现 AVL 树的简单代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int value;
int height;
struct Node* left;
struct Node* right;
} Node;
int max(int a, int b) {
return (a > b) ? a : b;
}
int height(Node* node) {
if (node == NULL) {
return 0;
}
return node->height;
}
int getBalance(Node* node) {
if (node == NULL) {
return 0;
}
return height(node->left) - height(node->right);
}
Node* rotateRight(Node* node) {
Node* newRoot = node->left;
Node* tempNode = newRoot->right;
newRoot->right = node;
node->left = tempNode;
node->height = 1 + max(height(node->left), height(node->right));
newRoot->height = 1 + max(height(newRoot->left), height(newRoot->right));
return newRoot;
}
Node* rotateLeft(Node* node) {
Node* newRoot = node->right;
Node* tempNode = newRoot->left;
newRoot->left = node;
node->right = tempNode;
node->height = 1 + max(height(node->left), height(node->right));
newRoot->height = 1 + max(height(newRoot->left), height(newRoot->right));
return newRoot;
}
Node* insert(Node* node, int value) {
if (node == NULL) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->value = value;
newNode->height = 1;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
if (value < node->value) {
node->left = insert(node->left, value);
} else if (value > node->value) {
node->right = insert(node->right, value);
} else {
return node;
}
node->height = 1 + max(height(node->left), height(node->right));
int balance = getBalance(node);
if (balance > 1 && value < node->left->value) {
return rotateRight(node);
}
if (balance < -1 && value > node->right->value) {
return rotateLeft(node);
}
if (balance > 1 && value > node->left->value) {
node->left = rotateLeft(node->left);
return rotateRight(node);
}
if (balance < -1 && value < node->right->value) {
node->right = rotateRight(node->right);
return rotateLeft(node);
}
return node;
}
void inorderTraversal(Node* node) {
if (node != NULL) {
inorderTraversal(node->left);
printf("%d ", node->value);
inorderTraversal(node->right);
}
}
int main() {
Node* root = NULL;
root = insert(root, 10);
root = insert(root, 20);
root = insert(root, 30);
root = insert(root, 40);
root = insert(root, 50);
root = insert(root, 25);
printf("中序遍历结果:");
inorderTraversal(root);
return 0;
}
```
这段代码定义了一个 `Node` 结构体用于表示 AVL 树的节点,包括节点的值、高度以及左右子节点的指针。代码中实现了插入操作 `insert`,以及右旋和左旋操作 `rotateRight` 和 `rotateLeft`。`getBalance` 函数用于计算节点的平衡因子,`max` 函数用于返回两个数中的较大值,`height` 函数用于返回节点的高度。`inorderTraversal` 函数用于中序遍历 AVL 树,方便验证插入操作的结果。
在 `main` 函数中,使用示例数据插入了若干节点,并对 AVL 树进行了中序遍历打印结果。
这只是一个简单的 AVL 树的实现示例,完整的 AVL 树的实现需要考虑更多边界条件和操作,例如删除节点、查找节点等。
### 回答3:
当然可以用C语言编写一个由平衡因子实现的二叉搜索树代码。
首先,我们需要定义一个二叉树节点的数据结构,代码如下:
```
typedef struct TreeNode {
int val;
int balance_factor; // 平衡因子
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
```
接下来,我们需要实现插入和平衡化操作。插入操作将根据节点的值来插入新节点,并随之更新节点的平衡因子。平衡化操作会检查节点的平衡因子,如果不平衡则通过旋转来调整树的结构。
插入操作的代码如下:
```
TreeNode* insert(TreeNode* root, int val) {
if (root == NULL) {
TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
node->val = val;
node->balance_factor = 0;
node->left = NULL;
node->right = NULL;
return node;
}
if (val < root->val) {
root->left = insert(root->left, val);
} else if (val > root->val) {
root->right = insert(root->right, val);
}
root->balance_factor = get_balance_factor(root);
root = balance(root);
return root;
}
```
平衡化操作的代码如下:
```
TreeNode* balance(TreeNode* node) {
int bf = get_balance_factor(node);
if (bf > 1) {
if (get_balance_factor(node->left) < 0) {
node->left = rotate_left(node->left);
}
node = rotate_right(node);
} else if (bf < -1) {
if (get_balance_factor(node->right) > 0) {
node->right = rotate_right(node->right);
}
node = rotate_left(node);
}
return node;
}
```
以上代码中,`get_balance_factor`函数用于计算节点的平衡因子,`rotate_left`函数用于左旋操作,`rotate_right`函数用于右旋操作。这些函数的具体实现根据具体需求来编写。
总体来说,这段代码实现了一个由平衡因子实现的二叉搜索树,可以通过插入和平衡化操作来维护树的平衡性。
阅读全文