手写平衡二叉树

构造一个平衡二叉树,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 

该程序实现了二叉平衡树的插入和中序遍历操作。在每次插入节点时,都会检查当前子树是否平衡,并进行相应的旋转操作以维持平衡

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值