前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >手写AVL 树

手写AVL 树

作者头像
ShenduCC
发布于 2019-04-01 06:59:53
发布于 2019-04-01 06:59:53
50100
代码可运行
举报
文章被收录于专栏:算法修养算法修养
运行总次数:0
代码可运行

平衡二叉树

左旋,右旋,左右旋,右左旋

具体原理就不说了,网上教程很多。这里只实现了建树的过程,没有实现删除节点的操作。

下一篇会实现删除节点的操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//
//  main.cpp
//  AVL
//
//  Created by 小康 on 2019/3/30.
//  Copyright © 2019 小康. All rights reserved.
//
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

using namespace std;

struct Tree
{
    Tree* leftChild;
    Tree* rightChild;
    int key;
    int value;
    int leftHeight;
    int rightHeight;
};

int num;
void LeftSpin(Tree*& root)
{
    Tree* temp = root;
    Tree* temp2 = root->rightChild->leftChild;
    root = temp->rightChild;
    root->leftChild = temp;
    temp->rightChild = temp2;
    
    root->leftChild->rightHeight = root->leftChild->rightChild==NULL?0:max(root->leftChild->rightChild->leftHeight,root->leftChild->rightChild->rightHeight)+1;
    
    root->leftHeight = max(root->leftChild->leftHeight,root->leftChild->rightHeight)+1;
}

void RightSpin(Tree*& root)
{
    Tree* temp = root;
    Tree* temp2 = root->leftChild->rightChild;
    
    root = temp->leftChild;
    root->rightChild = temp;
    temp->leftChild = temp2;
    
    root->rightChild->leftHeight =root->rightChild->leftChild==NULL?0:max(root->rightChild->leftChild->leftHeight,root->rightChild->leftChild->rightHeight)+1;
    root->rightHeight = max(root->rightChild->leftHeight,root->rightChild->rightHeight)+1;
}

void LeftRightSpin(Tree*& root)
{
    LeftSpin(root->leftChild);
    RightSpin(root);
}

void RightLeftSpin(Tree*& root)
{
    RightSpin(root->rightChild);
    LeftSpin(root);
}

void Insert(Tree*& root,int key,int value)
{
    if(root==NULL)
    {
        root = new Tree;
        root->leftChild=NULL;
        root->rightChild=NULL;
        root->key = key;
        root->value = value;
        root->leftHeight = 0;
        root->rightHeight = 0;
        return;
    }
   
    if(key < root->key)
    {
        Insert(root->leftChild,key,value);
        root->leftHeight = max(root->leftChild->leftHeight,root->leftChild->rightHeight)+1;
        if(root->leftHeight > root->rightHeight+1)
        {
            if(root->leftChild ->leftHeight > root->leftChild->rightHeight)
            {
                RightSpin(root);
            }
            else if(root->leftChild->leftHeight < root->leftChild->rightHeight)
            {
                LeftRightSpin(root);
            }
        }
    }
    else{
        Insert(root->rightChild, key,value);
        root->rightHeight = max(root->rightChild->leftHeight,root->rightChild->rightHeight)+1;
        
        if(root->leftHeight<root->rightHeight-1)
        {
            if(root->rightChild->rightHeight > root->rightChild->leftHeight)
            {
                LeftSpin(root);
            }
            else if(root->rightChild->rightHeight<root->rightChild->leftHeight)
            {
                RightLeftSpin(root);
            }
        }
    }
}

int Get(Tree* root,int key)
{
    if(key<root->key)
    {
       return Get(root->leftChild,key);
    }
    if(key>root->key)
    {
       return Get(root->rightChild,key);
    }
   
    return root->value;
    
}

int main()
{
    
    Tree* root = NULL ;
    
    Insert(root, 1, 1);
    Insert(root, 2, 2);
    Insert(root, 3, 3);
    Insert(root, 4, 4);
    printf("%d",Get(root,1));
    printf("%d",Get(root,2));
    printf("%d",Get(root,3));
    //Insert(root, 4, 5);
    
    
    
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-03-30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
手写AVL 树(下)
上一篇 手写AVL树上实现了AVL树的插入和查询 上代码: 头文件:AVL.h #include <iostream> template<typename T1,typename T2> struct Tree { Tree* leftChild; Tree* rightChild; Tree* father; T1 key; T2 value; int leftHeight; int rightHeight; }; template<t
ShenduCC
2019/04/18
5010
手写 avl tree
avl tree 又称 平衡二叉树。主要在排序二叉树的基础上进行的一个优化。避免排序二叉树不平衡,从而严重影响查询效率
shengjk1
2020/06/28
4690
【C++进阶】AVL树的模拟实现(附源码)
我们知道,二叉搜索树的效率很高,如果数据有序或接近有序二叉搜索树将退化为单支树,查 找元素相当于在顺序表中搜索元素,效率低下,为了解决这个问题,AVL树(平衡二叉树)就出现了。
aosei
2024/01/23
2060
【C++进阶】AVL树的模拟实现(附源码)
C++漫步结构与平衡的殿堂:AVL树
二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下,因此发明了 AVL 树
DARLING Zero two
2025/05/09
300
C++漫步结构与平衡的殿堂:AVL树
为实习准备的数据结构(5)-- 图解AVL树(平衡二叉搜索树)
二叉搜索树一定程度上可以提高搜索效率,但是当原序列有序,例如序列A = {1,2,3,4,5,6},构造二叉搜索树如图。依据此序列构造的二叉搜索树为右斜树,同时二叉树退化成单链表,搜索效率降低为O(n)。
看、未来
2021/03/17
3490
手撸二叉树——AVL平衡二叉树
还记得上一篇中我们遗留的问题吗?我们再简要回顾一下,现在有一颗空的二叉查找树,我们分别插入1,2,3,4,5,五个节点,那么得到的树是什么样子呢?这个不难想象,二叉树如下:
小忽悠
2024/10/17
1270
手撸二叉树——AVL平衡二叉树
平衡二叉树(AVL树)
​ 平衡二叉树 :(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:
用户11097514
2024/05/30
1290
初识C++ · AVL树(2)
AVL树作为一种结构,理解树的本身是不大难的,难的在于,树旋转之后的连接问题,写AVL树的代码大部分都是在旋转部分,所以连接问题是比较需要细心的,那么这里来说呢,把细心做好,变量的位置放好,连接的次序连接对,就成功了。
_lazy
2024/10/16
640
初识C++ · AVL树(2)
图解数据结构树之AVL树
AVL树本质上是一颗二叉查找树,但是它又具有以下特点:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为平衡二叉树。下面是平衡二叉树和非平衡二叉树对比的例图:
233333
2019/08/05
1.5K0
图解数据结构树之AVL树
AVL树深度解析
我们上一篇博客讲了,二叉搜索树在极端情况下会退化为单支树的情况(具体可以看上一篇博客:http://t.csdnimg.cn/o7PiL)。那我们该如何解决这种问题呢?
小灵蛇
2024/06/06
1040
AVL树深度解析
AVL树(Java语言)
平衡二叉树也叫平衡二叉查找树,又被称为AVL树,可以保证查询效率较高。它的特点是:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。 结点的平衡因子定义为:结点的左子树高度与右子树高度之差。显然,对一棵AVL树而言,其所有结点的平衡因子只能是-1,0,1.挡在一棵AVL树上插入一个结点时,有可能导致失衡,即出现绝对值大于1的平衡因子。
技术交流
2022/11/18
4400
AVL树(Java语言)
数据结构(5)-- 图解AVL树(平衡二叉搜索树)
二叉搜索树一定程度上可以提高搜索效率,但是当原序列有序,例如序列A = {1,2,3,4,5,6},构造二叉搜索树如图。依据此序列构造的二叉搜索树为右斜树,同时二叉树退化成单链表,搜索效率降低为O(n)。
看、未来
2021/09/18
5900
种树:二叉树、二叉搜索树、AVL树、红黑树、哈夫曼树、B树、树与森林
树是我们计算机中非常重要的一种数据结构,同时使用树这种数据结构,可以描述现实生活中的很多事物,例如家 谱、单位的组织架构、等等。 树是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就 是说它是根朝上,而叶朝下的。
看、未来
2020/08/25
1.2K0
种树:二叉树、二叉搜索树、AVL树、红黑树、哈夫曼树、B树、树与森林
【C++】二叉搜索树+变身 = AVL树
本篇文章不会带你从头到尾实现AVL树,但会带你深入理解AVL树是怎么实现平衡的,怎么通过旋转变换实现保持平衡,以及实现平衡过程中的细节应该怎么处理等。
_小羊_
2024/10/16
650
【C++】二叉搜索树+变身 = AVL树
【数据结构】优秀树结构之一 平衡二叉树(AVL树)
给你一个数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST), 并分析问题所在. :
冷环渊
2022/03/30
1980
【数据结构】优秀树结构之一 平衡二叉树(AVL树)
平衡二叉树(AVL树)
平衡二叉树也叫自平衡二叉搜索树(Self-Balancing Binary Search Tree),所以其本质也是一颗二叉搜索树,不过为了限制左右子树的高度差,避免出现倾斜树等偏向于线性结构演化的情况,所以对二叉搜索树中每个节点的左右子树作了限制,左右子树的高度差称之为平衡因子,树中每个节点的平衡因子绝对值不大于1,此时二叉搜索树称之为平衡二叉树。自平衡是指,在对平衡二叉树执行插入或删除节点操作后,可能会导致树中某个节点的平衡因子绝对值超过1,即平衡二叉树变得“不平衡”,为了恢复该节点左右子树的平衡,此时需要对节点执行旋转操作。
狼啸风云
2019/11/28
1K0
C++进阶:AVL树详解及模拟实现(图示讲解旋转过程)
更新后,需要检查父节点的平衡因子是否发生变化,如果发生变化,则继续向上检查祖先节点的平衡因子,直到根节点或者到达一个平衡因子为 ±1 的节点为止。根据更新后节点的平衡因子情况,可以采取以下处理措施:
是Nero哦
2024/05/16
2210
C++进阶:AVL树详解及模拟实现(图示讲解旋转过程)
AVL树模拟实现
AVL树,是一种“平衡”的二叉搜索树,关于搜索树的介绍和模拟,我已经在该篇文章(二叉搜索树的模拟实现-CSDN博客)介绍过,想复习或者了解二叉搜索树的读者可以去看看哦
用户11039529
2024/08/17
890
AVL树模拟实现
[C++] 剖析AVL树功能的实现原理
AVL树是由Adelson-Velsky和Landis发明的第一种自平衡二叉搜索树,它通过控制每个节点左右子树的高度差(称为平衡因子)不超过1,确保树的高度维持在对数级别。这种自平衡特性使得AVL树的查找、插入和删除操作的时间复杂度保持在 O(log⁡N)O(\log N)O(logN),从而提升效率。
DevKevin
2024/10/03
1370
[C++] 剖析AVL树功能的实现原理
数据结构小记【Python/C++版】——AVL树篇
AVL树的具体特点是,每一个节点的左子树和右子树的高度差的绝对值最多为1,且其左子树和右子树也是AVL树。
Coder-ZZ
2023/02/23
2730
数据结构小记【Python/C++版】——AVL树篇
推荐阅读
相关推荐
手写AVL 树(下)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验