构造一个平衡二叉树,AVL Tree
参考代码一:
#include<iostream>
using namespace std;
class AVLTree{
struct Node{
int data;
Node *left;
Node *right;
int height;
Node(int v):data(v),left(NULL),right(NULL),height(1){}
};
Node *root;
int height(Node *node);
Node* RR(Node *root);
Node* LL(Node *root);
Node* LR(Node *root);
Node* RL(Node *root);
Node *insert(Node *node,int value);
void inorder(Node *node);
public:
AVLTree():root(NULL){}
void insert(int value);
void inorder();
};
int AVLTree::height(Node *node){
if(node==NULL)
return 0;
return node->height;
}
AVLTree::Node* AVLTree::RR(Node *root){
Node *newRoot = root->right;
root->right = newRoot->left;
newRoot->left = root;
root->height = max(height(root->left),height(root->right))+1;
newRoot->height = max(height(newRoot->left),height(newRoot->right))+1;
return newRoot;
}
AVLTree::Node* AVLTree::LL(Node *root){
Node *newRoot = root->left;
root->left = newRoot->right;
newRoot->right = root;
root->height = max(height(root->left),height(root->right))+1;
newRoot->height = max(height(newRoot->left),height(newRoot->right))+1;
return newRoot;
}
AVLTree::Node* AVLTree::LR(Node *root){
root->left = RR(root->left);
root = LL(root);
return root;
}
AVLTree::Node* AVLTree::RL(Node *root){
root->right = LL(root->right);
root = RR(root);
return root;
}
AVLTree::Node* AVLTree::insert(Node *node,int value){
if(node == NULL)
return new Node(value);
if(value < node->data)
node->left = insert(node->left,value);
else
node->right = insert(node->right,value);
int balanceFactor = height(node->left)-height(node->right);
if(balanceFactor > 1 && value < node->left->data)
return LL(node);
if(balanceFactor > 1 && value > node->left->data)
return LR(node);
if(balanceFactor < -1 && value > node->right->data)
return RR(node);
if(balanceFactor < -1 && value < node->right->data)
return RL(node);
node->height = max(height(node->left),height(node->right))+1;
return node;
}
void AVLTree::insert(int value){
root = insert(root,value);
}
void AVLTree::inorder(){
inorder(root);
}
void AVLTree::inorder(Node *node){
if(node == NULL)
return;
inorder(node->left);
cout<<node->data<<" ";
inorder(node->right);
}
int main(){
AVLTree t;
cout << "二叉树插入节点:" << endl;
t.insert(10);
t.insert(20);
t.insert(30);
t.insert(40);
t.insert(50);
t.insert(25);
cout << "中序遍历二叉树:" << endl;
t.inorder();
return 0;
}
//输出:
二叉树插入节点:
中序遍历二叉树:
10 20 25 30 40 50
参考代码二:
#include <iostream>
using namespace std;
class Node {
public:
int key;
Node* left;
Node* right;
int height;
};
int max(int a, int b);
int height(Node* node) {
if (node == NULL)
return 0;
return node->height;
}
int max(int a, int b) {
return (a > b) ? a : b;
}
Node* newNode(int key) {
Node* node = new Node();
node->key = key;
node->left = NULL;
node->right = NULL;
node->height = 1;
return(node);
}
Node *rightRotate(Node *y) {
Node *x = y->left;
Node *T2 = x->right;
x->right = y;
y->left = T2;
y->height = max(height(y->left), height(y->right)) + 1;
x->height = max(height(x->left), height(x->right)) + 1;
return x;
}
Node *leftRotate(Node *x) {
Node *y = x->right;
Node *T2 = y->left;
y->left = x;
x->right = T2;
x->height = max(height(x->left), height(x->right)) + 1;
y->height = max(height(y->left), height(y->right)) + 1;
return y;
}
int getBalance(Node *node) {
if (node == NULL)
return 0;
return height(node->left) - height(node->right);
}
Node* insert(Node* node, int key) {
if (node == NULL)
return(newNode(key));
if (key < node->key)
node->left = insert(node->left, key);
else if (key > node->key)
node->right = insert(node->right, key);
else
return node;
node->height = 1 + max(height(node->left),
height(node->right));
int balance = getBalance(node);
if (balance > 1 && key < node->left->key)
return rightRotate(node);
if (balance < -1 && key > node->right->key)
return leftRotate(node);
if (balance > 1 && key > node->left->key) {
node->left = leftRotate(node->left);
return rightRotate(node);
}
if (balance < -1 && key < node->right->key) {
node->right = rightRotate(node->right);
return leftRotate(node);
}
return node;
}
void preOrder(Node *root) {
if(root != NULL) {
cout << root->key << " ";
preOrder(root->left);
preOrder(root->right);
}
}
int main() {
Node *root = NULL;
cout << "二叉树插入节点:" << endl;
root = insert(root, 10);
root = insert(root, 20);
root = insert(root, 30);
root = insert(root, 40);
root = insert(root, 50);
root = insert(root, 25);
cout << "Preorder traversal of the "
"constructed AVL tree is \n";
cout << "前序遍历二叉树:" << endl;
preOrder(root);
return 0;
}
//输出:
二叉树插入节点:
Preorder traversal of the constructed AVL tree is
前序遍历二叉树:
30 20 10 25 40 50
在这个实现中,Node 类表示二叉平衡树的节点。每个节点包含一个 key 值,一个指向左子树的指针 left,一个指向右子树的指针 right,以及一个表示该节点的高度 height。
max 函数返回两个数中的最大值,height 函数返回给定节点的高度。newNode 函数创建一个新的具有给定 key 值的节点,并将其左右子树和高度初始化为 NULL。
参考代码三:
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
struct Node {
int val;
Node *left, *right;
int height;
};
Node* newNode(int val) {
Node* node = new Node();
node->val = val;
node->left = NULL;
node->right = NULL;
node->height = 1; // 新节点高度为1
return(node);
}
int height(Node* node) {
if (node == NULL)
return 0;
return node->height;
}
// 右旋操作
Node* rightRotate(Node* y) {
Node* x = y->left;
Node* T2 = x->right;
x->right = y;
y->left = T2;
// 更新高度
y->height = max(height(y->left), height(y->right)) + 1;
x->height = max(height(x->left), height(x->right)) + 1;
return x;
}
// 左旋操作
Node* leftRotate(Node* x) {
Node* y = x->right;
Node* T2 = y->left;
y->left = x;
x->right = T2;
// 更新高度
x->height = max(height(x->left), height(x->right)) + 1;
y->height = max(height(y->left), height(y->right)) + 1;
return y;
}
// 获取节点的平衡因子
int getBalance(Node* node) {
if (node == NULL)
return 0;
return height(node->left) - height(node->right);
}
// 插入节点
Node* insert(Node* node, int val) {
if (node == NULL)
return (newNode(val));
if (val < node->val)
node->left = insert(node->left, val);
else if (val > node->val)
node->right = insert(node->right, val);
else // 重复值不插入
return node;
// 更新高度
node->height = max(height(node->left), height(node->right)) + 1;
int balance = getBalance(node);
// 平衡维护
if (balance > 1 && val < node->left->val)
return rightRotate(node);
if (balance < -1 && val > node->right->val)
return leftRotate(node);
if (balance > 1 && val > node->left->val) {
node->left = leftRotate(node->left);
return rightRotate(node);
}
if (balance < -1 && val < node->right->val) {
node->right = rightRotate(node->right);
return leftRotate(node);
}
return node;
}
// 中序遍历
void inOrder(Node* root) {
if (root != NULL) {
inOrder(root->left);
cout << root->val << " ";
inOrder(root->right);
}
}
int main() {
Node* root = NULL;
/* 示例如下:
10
/ \
20 30
/ \
40 50
*/
root = insert(root, 10);
root = insert(root, 20);
root = insert(root, 30);
root = insert(root, 40);
root = insert(root, 50);
cout << "中序遍历结果:";
inOrder(root);
return 0;
}
//输出:
中序遍历结果:10 20 30 40 50
参考代码四:
#include <iostream>
using namespace std;
struct Node {
int data;
Node* left;
Node* right;
int height; // 节点高度
};
class AVLTree {
public:
Node* root;
AVLTree() {
root = NULL;
}
// 计算节点高度
int height(Node* node) {
if (node == NULL) return 0;
return node->height;
}
// 计算节点平衡因子
int balanceFactor(Node* node) {
if (node == NULL) return 0;
return height(node->left) - height(node->right);
}
// 左旋转
Node* leftRotate(Node* node) {
Node* newRoot = node->right;
node->right = newRoot->left;
newRoot->left = node;
// 更新节点高度
node->height = max(height(node->left), height(node->right)) + 1;
newRoot->height = max(height(newRoot->left), height(newRoot->right)) + 1;
return newRoot;
}
// 右旋转
Node* rightRotate(Node* node) {
Node* newRoot = node->left;
node->left = newRoot->right;
newRoot->right = node;
// 更新节点高度
node->height = max(height(node->left), height(node->right)) + 1;
newRoot->height = max(height(newRoot->left), height(newRoot->right)) + 1;
return newRoot;
}
// 插入节点
Node* insertNode(Node* node, int data) {
if (node == NULL) {
node = new Node;
node->data = data;
node->left = NULL;
node->right = NULL;
node->height = 1;
} else if (data < node->data) {
node->left = insertNode(node->left, data);
} else if (data > node->data) {
node->right = insertNode(node->right, data);
}
// 更新节点高度
node->height = max(height(node->left), height(node->right)) + 1;
// 计算平衡因子
int balance = balanceFactor(node);
// 左旋转
if (balance > 1 && data < node->left->data) {
return rightRotate(node);
}
// 右旋转
if (balance < -1 && data > node->right->data) {
return leftRotate(node);
}
// 左右双旋转
if (balance > 1 && data > node->left->data) {
node->left = leftRotate(node->left);
return rightRotate(node);
}
// 右左双旋转
if (balance < -1 && data < node->right->data) {
node->right = rightRotate(node->right);
return leftRotate(node);
}
return node;
}
// 中序遍历
void inorderTraversal(Node* node) {
if (node == NULL) return;
inorderTraversal(node->left);
cout << node->data << " ";
inorderTraversal(node->right);
}
};
int main() {
AVLTree tree;
tree.root = tree.insertNode(tree.root, 10);
tree.root = tree.insertNode(tree.root, 20);
tree.root = tree.insertNode(tree.root, 30);
tree.root = tree.insertNode(tree.root, 40);
tree.root = tree.insertNode(tree.root, 50);
tree.root = tree.insertNode(tree.root, 25);
cout << "AVL树中序遍历结果:" << endl;
tree.inorderTraversal(tree.root);
cout << endl;
return 0;
}
//输出:
AVL树中序遍历结果:
10 20 25 30 40 50
参考代码五:
#include <iostream>
using namespace std;
// 节点结构体
struct Node {
int val;
int height;
Node* left;
Node* right;
Node(int v):val(v), height(1), left(nullptr), right(nullptr) {}
};
// 获取节点高度
int getHeight(Node* node) {
if (node == nullptr) return 0;
return node->height;
}
// 获取节点平衡因子
int getBalanceFactor(Node* node) {
if (node == nullptr) return 0;
return getHeight(node->left) - getHeight(node->right);
}
// 更新节点高度
void updateHeight(Node* node) {
node->height = max(getHeight(node->left), getHeight(node->right)) + 1;
}
// 左旋操作
Node* leftRotate(Node* node) {
Node* newRoot = node->right;
node->right = newRoot->left;
newRoot->left = node;
updateHeight(node);
updateHeight(newRoot);
return newRoot;
}
// 右旋操作
Node* rightRotate(Node* node) {
Node* newRoot = node->left;
node->left = newRoot->right;
newRoot->right = node;
updateHeight(node);
updateHeight(newRoot);
return newRoot;
}
// 插入操作
Node* insert(Node* root, int v) {
if (root == nullptr) {
return new Node(v);
}
if (v < root->val) {
root->left = insert(root->left, v);
} else {
root->right = insert(root->right, v);
}
updateHeight(root);
int bf = getBalanceFactor(root);
if (bf > 1 && getBalanceFactor(root->left) >= 0) {
return rightRotate(root);
}
if (bf > 1 && getBalanceFactor(root->left) < 0) {
root->left = leftRotate(root->left);
return rightRotate(root);
}
if (bf < -1 && getBalanceFactor(root->right) <= 0) {
return leftRotate(root);
}
if (bf < -1 && getBalanceFactor(root->right) > 0) {
root->right = rightRotate(root->right);
return leftRotate(root);
}
return root;
}
// 中序遍历
void inorderTraversal(Node* root) {
if (root == nullptr) return;
inorderTraversal(root->left);
cout << root->val << " ";
inorderTraversal(root->right);
}
int main() {
Node* root = nullptr;
// 插入操作
root = insert(root, 10);
root = insert(root, 20);
root = insert(root, 30);
root = insert(root, 40);
root = insert(root, 50);
root = insert(root, 25);
// 中序遍历
cout << "中序遍历结果: " << endl;
inorderTraversal(root);
return 0;
}
//输出:
中序遍历结果:
10 20 25 30 40 50
该程序实现了二叉平衡树的插入和中序遍历操作。在每次插入节点时,都会检查当前子树是否平衡,并进行相应的旋转操作以维持平衡