首页 > 其他分享 >BST和AVL

BST和AVL

时间:2025-01-03 11:33:19浏览次数:6  
标签:node right TreeNode BST value AVL return left

二叉搜索树binary search tree 和 平衡二叉搜索树 AVL

#include <iostream>
using namespace std;

struct TreeNode{
    int val;
    TreeNode* left;
    TreeNode* right;
    int height;
    TreeNode(int value):val(value),left(nullptr),right(nullptr){}
};

class BST{
private:
    TreeNode* root;

    TreeNode* insert(TreeNode* node,int value){
        if(!node){
            return new TreeNode(value);
        }
        if(value<node->val){
            node->left=insert(node->left,value);
        }else if(value>node->val){
            node->right=insert(node->right,value);
        }
        return node;
    }

    TreeNode* search(TreeNode* node, int value){
        if(!node||node->val==value){
            return node;
        }
        if(value<node->val){
            return search(node->left,value);
        }else{
            return search(node->right,value);
        }
    }

    TreeNode* deleteNode(TreeNode* node,int value){
        if(!node) return nullptr;
        if(value<node->val)
            node->left=deleteNode(node->left,value);
        else if(value>node->val)
            node->right=deleteNode(node->right,value);
        else{//找到要删除的节点
            if(!node->left)
                return node->right;
            else if(!node->right)
                return node->left;
            else{
                TreeNode* minNode=node->right;
                while(minNode->left){
                    minNode=minNode->left;
                }
                node->val=minNode->val;
                node->right=deleteNode(node->right,minNode->val);
            }
        } 
        return node;   
    }

    void inorder(TreeNode* node){
        if(node){
            inorder(node->left);
            cout<<node->val<<" ";
            inorder(node->right);
        }
    }

public:
BST():root(nullptr){}

    void insert(int value){
        root=insert(root,value);
    }

    TreeNode* search(int value){
        return search(root,value);
    }

    void deleteNode(int value){
        root=deleteNode(root,value);
    }

    void inorder(){
        inorder(root);
    }
};


平衡二叉搜索树AVL

class AVLTree{
private:
     // 获取节点高度
    int getHeight(TreeNode* node) {
        return node ? node->height : 0;
    }

    // 更新节点高度
    void updateHeight(TreeNode* node) {
        node->height = max(getHeight(node->left), getHeight(node->right)) + 1;
    }

    // 获取平衡因子
    int getBalance(TreeNode* node) {
        return node ? getHeight(node->left) - getHeight(node->right) : 0;
    }

    //右旋
    TreeNode* rightRotate(TreeNode* y){
        TreeNode* x=y->left;
        TreeNode* T2=x->right;

        x->right=y;
        y->left=T2;
        return x;
    }
     // 左旋
    TreeNode* leftRotate(TreeNode* x) {
        TreeNode* y = x->right;
        TreeNode* T2 = y->left;
        // 旋转
        y->left = x;
        x->right = T2;

        return y; // 新的根节点
    }

    // 插入节点
    TreeNode* insert(TreeNode* node, int value) {
        if (!node) return new TreeNode(value);

        if (value < node->val) {
            node->left = insert(node->left, value);
        } else if (value > node->val) {
            node->right = insert(node->right, value);
        } else {
            return node; // 不允许重复值
        }
        // 检查平衡
        int balance = getBalance(node);   
        // LL情况
        if (balance > 1 && value < node->left->val) {
            return rightRotate(node);
        }
        // RR情况
        if (balance < -1 && value > node->right->val) {
            return leftRotate(node);
        }
        // LR情况 左旋左孩子,然后根节点右旋
        if (balance > 1 && value > node->left->val) {
            node->left = leftRotate(node->left);
            return rightRotate(node);
        }
        // RL情况 右旋右孩子,然后根节点左旋
        if (balance < -1 && value < node->right->val) {
            node->right = rightRotate(node->right);
            return leftRotate(node);
        }

        return node; // 返回未改变的节点指针
    }
};````

标签:node,right,TreeNode,BST,value,AVL,return,left
From: https://www.cnblogs.com/szyounger/p/18649780

相关文章

  • obstacle vs barrier coca
     left4WORD1:OBSTACLE WORDW1W2 BIGGEST46086ThebiggestobstacleIfaceis我面临的最大障碍是Thebiggestobstacleforuswasthat对我们来说最大的障碍是 MAIN13932themainobstacle主要障碍 AN1914475 SERIOUS8122isaseriousobst......
  • 关于 Webstorm 2024 安装激活教程以及常见问题(激活至2026,实际上永久,亲测!)
    申明:本教程Webstorm补丁、激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除。若条件允许,希望大家购买正版!卸载老版本Webstorm首先,如果小伙伴的电脑上有安装老版本的Webstorm,需要将其彻底卸载掉,如下所示(没有安装则不用管,直接安装即可):TIP:如果你之......
  • 数据结构复习 (二叉查找树,高度平衡树AVL)
    1.二叉查找树:为了更好的实现动态的查找(可以插入/删除),并且不超过logn的时间下达成目的定义:二叉查找树(亦称二叉搜索树、二叉排序树)是一棵二叉树,其各结点关键词互异,且中根序列按其关键词递增排列。等价描述:二叉查找树中任一结点P,其左子树中结点的关键词都小于P的关键词......
  • 最早发明的自平衡二叉树:AVL
    前言更好的阅读体验默认读者会基本的BST操作。节点定义平衡因子:BF(BalanceFactor),左子树高\(-\)右子树高。平衡树是让树的形态尽可能像完全二叉树,而不是链。在AVL中,我们认为\(\left|\text{BF}\right|\le1\),也就是BF为\(0,1,-1\)时的子树是平衡的,否则就是不平衡......
  • 如何在Windows上正确启用PHP的mbstring扩展?
    1.确保 php_mbstring.dll 文件存在首先,你需要确认你的PHP安装目录中确实包含了php_mbstring.dll文件。通常情况下,这个文件位于PHP安装目录下的ext文件夹中。如果你没有找到这个文件,可能是因为你下载的PHP版本默认没有包含这个扩展。此时,你可以考虑重新下载一个完整的PHP安装包......
  • 【Basic Abstract Algebra】Exercises for Section 3.5 — Fundamental Isomorphism t
    Let\(G=\{(a,b)\mida,b\in\mathbbR,~a\neq0\}\)with\((a,b)(c,d)=(ac,ad+b)\)beagroup,\(K=\{(1,b)\midb\in\mathbbR\}\).Showthat\(G/K\cong\mathbbR^*\).Proof:Let\[\begin{aligned}\varphi:\quadG&\to\mathbbR^*\\......
  • 【Basic Abstract Algebra】Exercises for Section 3.3 — Homomorphism of groups
    Findoutallpossiblehomomorphismfrom\(\mathbbZ_7\to\mathbbZ_{12}\).Solution:Let\(\varphi\)besuchahomomorphism.Since\(\mathbbZ_7\)isacyclicgroup,so\(\varphi\)isspecifiedby\(\varphi(\bar1)\).Since\(o(\bar1)=7......
  • 【Basic Abstract Algebra】Exercises for Section 3.2 — Normal subgroups and fact
    If\(H<G\)and\([G:H]=2\),showthat\(H\triangleleftG\).Proof:If\([G:H]=2\),then\(gH=Hg\)forall\(g\inG\),so\(H\triangleleftG\).【BasicAbstractAlgebra】ExercisesforSection3.1—CosetsandLagrange'sTheorem-只会......
  • Active Pose Relocalization for Intelligent Substation Inspection Robot
    (未完成:加思维导图、段落分析、pipeline)ActivePoseRelocalizationforIntelligentSubstationInspectionRobot智能变电站巡检机器人主动姿态重定位摘要:变电站中广泛应用的智能巡检机器人在对电气设备进行日常巡检时,要求采集与标定图像一致的巡检图像。然而,由于导航......
  • substring( )的两种用法?
    xx.substring()括号中带的参数不一样,效果就会有很大的区别1.xx.substring(0,2)表示取第一个和第二个字符(0,1,2表示第一、二、三个字符,含头不含尾的原则就只包含第一、二个字符),返回一个新的字符串(只包含指定的第一和第二个字符);2.xx.substring(2)表示去掉前两个字符,返回一个新的字......