跳过正文
  1. 博客/
  2. 随笔/
  3. 编程/

AVL树实现原理

·2 分钟· ·
随笔 编程
目录

本篇博客主要基于这篇博客的扩展,建议阅读前先阅读这篇博文,这篇博文详细介绍AVL树的实现原理,完整代码在githubavl.go文件中

浅谈"树"这种数据结构
Github
可视化页面

引言
#

AVL树是在对二叉搜索树的一种优化,通过构造一棵高度平衡的二叉搜索树从而实现提高空间利用率,所以在了解如何实现之前,必须了解如何构造一棵二叉搜索树,你可以阅读我的这篇博客了解如何构建一棵二叉搜索树,虽然我是用Go来实现的,但是不必了解太多Go方面的知识,我在博客中尽量使用图片的方式来介绍实现原理

二叉搜索树实现原理

由于AVL树本质上也是一棵二叉搜索树,查找并不会改变树的性质,所以AVL的查找也是同二叉搜索树的查询相同,所以这里就重点介绍如何实现“增”和“删”

树的字段
#

在开始介绍如何实现“增”、“删”之前,我想提一下AVL树的存贮字段,在wiki上面的AVL和很多资料上面,AVL的树结构分别由下面四个组成: Val、 Left*、Right*、Parent*。

Val代表树存贮的值,Left、Right、Parent代表三个指针,分别指向左子树,右子树,父亲,而在我的实现中,我去掉了父亲指针,对于讲解来说,使用一个父指针能很好的解决从子遍历到父亲的经过,但在实际的应用中,我们完全可以使用一个列表存贮从父亲到儿子之间的值,这样的话,能实现一样的功能,而且能节省存贮空间(每个子树都少了一个父指针),但是相应的程序也变得比较复杂起来。

虽然我在讲解的过程中会直接获取节点的父节点,但是在实际的代码实现中,是通过获取从列表中获取该节点的父节点。

AVL树的“增”
#

引用
#

https://en.wikipedia.org/wiki/AVL_tree

相关文章

二叉搜索树实现原理
·4 分钟
随笔 编程
本篇博客主要基于这篇博客的扩展,建议阅读前先阅读这篇博文,这篇博文详细介绍二叉搜索树的实现原理,完整代码在github的binary.go文件中 浅谈"树"这种数据结构 Github 可视化页面 引言 # 之所以使用Go来实现,个人还是比较喜欢Go的,作为一个基础数据结构,Go用来实现这个速度比Java、C++都快,而且相比Java也能节省内存,而且我也不喜欢换使用冒号。
浅谈"树"这种数据结构
·10 分钟
随笔 编程
一直以来我对树这种数据结构就比较头疼,随便找一个红黑树的博客,大部分都是在谈怎么旋转怎么插入怎么删除,将算法讲的头头是道,但是就算你看懂了也不懂为什么要这样做,所以我们这篇博文就从可视化的角度,慢慢的介绍这些树的来世今生。
从问题理解动态规划
·5 分钟
随笔 编程
网上关于动态规划的资料,大部分直接给结论,所以一开始我一头雾水,搞不懂为什么要这么做,这篇博文就从实际问题出发,简单的剖析动态规划
几个有趣的动态规划
·6 分钟
随笔 编程
这篇博文是从问题理解动态规划的练习篇,通过几个动态规划的问题剖析进一步理解动态规划 找零钱练习题 # 给定一个零钱数组比如[1, 2, 5],每个值代表一个面额的纸币,给定一个总数(aim),求换钱有多少种方法(每种面额纸币不限量) 这个问题非常经典,所以我就从最先容易想到的算法出发慢慢推导出动态规划
漫谈排序算法
·4 分钟
随笔 编程
0x00 引子 # 排序是很多算法的基础,简简单单的排序前人就归纳出很多种算法,但是这些算法多多少少都有着相同的原理
怎么成为数据科学家(翻译)
·2 分钟
随笔 编程 阅读总结
这是我从Quora上看到的一篇非常简短但详细的数据科学家的‘技能点’ 来自eBay的一个数据科学家的回答 翻译来自Quora回答