update
This commit is contained in:
parent
90b8b370d7
commit
c6e88be7b1
135
src/12/c13/c13_avl.cpp
Normal file
135
src/12/c13/c13_avl.cpp
Normal file
@ -0,0 +1,135 @@
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
|
||||
using namespace std;
|
||||
|
||||
struct Node {
|
||||
int key; // 节点的关键字
|
||||
int left; // 左子节点在数组中的索引
|
||||
int right; // 右子节点在数组中的索引
|
||||
int height; // 节点高度
|
||||
|
||||
Node(int k = 0) : key(k), left(-1), right(-1), height(1) {}
|
||||
};
|
||||
|
||||
class AVLTree {
|
||||
private:
|
||||
vector<Node> tree; // 存储节点的数组
|
||||
int root; // 根节点的索引
|
||||
int size; // 当前节点数
|
||||
const int MAX_SIZE = 100; // 最大节点数
|
||||
|
||||
// 获取节点高度
|
||||
int getHeight(int index) {
|
||||
if (index == -1) return 0;
|
||||
return tree[index].height;
|
||||
}
|
||||
|
||||
// 计算平衡因子
|
||||
int getBalance(int index) {
|
||||
if (index == -1) return 0;
|
||||
return getHeight(tree[index].left) - getHeight(tree[index].right);
|
||||
}
|
||||
|
||||
// 右旋
|
||||
int rightRotate(int y) {
|
||||
int x = tree[y].left;
|
||||
int T2 = tree[x].right;
|
||||
|
||||
// 执行旋转
|
||||
tree[x].right = y;
|
||||
tree[y].left = T2;
|
||||
|
||||
// 更新高度
|
||||
tree[y].height = max(getHeight(tree[y].left), getHeight(tree[y].right)) + 1;
|
||||
tree[x].height = max(getHeight(tree[x].left), getHeight(tree[x].right)) + 1;
|
||||
|
||||
return x;
|
||||
}
|
||||
|
||||
// 左旋
|
||||
int leftRotate(int x) {
|
||||
int y = tree[x].right;
|
||||
int T2 = tree[y].left;
|
||||
|
||||
// 执行旋转
|
||||
tree[y].left = x;
|
||||
tree[x].right = T2;
|
||||
|
||||
// 更新高度
|
||||
tree[x].height = max(getHeight(tree[x].left), getHeight(tree[x].right)) + 1;
|
||||
tree[y].height = max(getHeight(tree[y].left), getHeight(tree[y].right)) + 1;
|
||||
|
||||
return y;
|
||||
}
|
||||
|
||||
// 插入节点并返回新的根索引
|
||||
int insertNode(int node, int key) {
|
||||
// 1. 进行普通的 BST 插入
|
||||
if (node == -1) {
|
||||
if (size >= MAX_SIZE) {
|
||||
cout << "Tree is full!" << endl;
|
||||
return -1;
|
||||
}
|
||||
tree.emplace_back(Node(key));
|
||||
return size++;
|
||||
}
|
||||
|
||||
if (key < tree[node].key) {
|
||||
tree[node].left = insertNode(tree[node].left, key);
|
||||
}
|
||||
else if (key > tree[node].key) {
|
||||
tree[node].right = insertNode(tree[node].right, key);
|
||||
}
|
||||
else { // 相同的键不插入
|
||||
return node;
|
||||
}
|
||||
|
||||
// 2. 更新高度
|
||||
tree[node].height = 1 + max(getHeight(tree[node].left), getHeight(tree[node].right));
|
||||
|
||||
// 3. 获取平衡因子
|
||||
int balance = getBalance(node);
|
||||
|
||||
// 4. 如果不平衡,进行相应的旋转
|
||||
|
||||
// 左左情况
|
||||
if (balance > 1 && key < tree[tree[node].left].key)
|
||||
return rightRotate(node);
|
||||
|
||||
// 右右情况
|
||||
if (balance < -1 && key > tree[tree[node].right].key)
|
||||
return leftRotate(node);
|
||||
|
||||
// 左右情况
|
||||
|
||||
// 右左情况
|
||||
|
||||
return node; // 无需旋转
|
||||
}
|
||||
|
||||
// 中序遍历
|
||||
void inorderTraversal(int node) {
|
||||
if (node == -1) return;
|
||||
inorderTraversal(tree[node].left);
|
||||
cout << tree[node].key << " ";
|
||||
inorderTraversal(tree[node].right);
|
||||
}
|
||||
|
||||
public:
|
||||
AVLTree() : root(-1), size(0) {
|
||||
tree.reserve(MAX_SIZE);
|
||||
}
|
||||
|
||||
// 插入键
|
||||
void insert(int key) {
|
||||
root = insertNode(root, key);
|
||||
}
|
||||
|
||||
// 中序遍历打印
|
||||
void inorder() {
|
||||
inorderTraversal(root);
|
||||
cout << endl;
|
||||
}
|
||||
};
|
Loading…
Reference in New Issue
Block a user