白话平衡二叉树

  对于我们做Java开发的程序员来,绝大多数时候我们并不需要自己去实现一个平衡二叉树的数据结构,很多用到二叉树的地方都是封装好的算法,我们只需要利用暴露出来的API就行了,那么对于平衡二叉树,虽然不需要去实现,但是理解原理对我们是很有帮助的,特别是底层如果使用了平衡二叉树,那么就能够清晰的知道他的性能。

  那么我们怎么样去理解平衡二叉树呢?

  我们都清楚,二叉树的查找性能最坏是链表查找,复杂度是O(1),而平衡二叉树的复杂度是log2(N),这在数据量比较大的情况下性能差距是很大的。所以我们就要尽量把树变成平衡二叉树,也就是所谓的高度平衡。最坏性能的情况是链表,对于这种数据结构来说,给我们感性的认识是这种数据结构很瘦,而满二叉树,完全二叉树很胖,因为胖,所以层数少,所以查找性能好。因此构建二叉树的时候要尽量做到很胖,而不要很瘦。这就是平衡二叉树。

  另外,关于构建二叉树的时候,有什么左旋转,有旋转,什么LL,RR,LR,RL这几种型号,其实也不用去记这种结构,我们只需要知道,假如有3个节点的链表,顺序增大或者减小,我们要把这种结构的链表编程二叉树,只需要用手抓住中间节点向上提一下,让中间节点在上方,两头的节点在下方,这就是让我们的层数减少了1,也就是在插入的时候平衡因子为2的时候破坏平衡性的时候,向上一提,层数减少1,于是又回到了平衡二叉树。这里说的是3个节点的顺序链表(用  大-中-小 来表示或者是小-中-大,都一样),如果是RL或者LR型,他不是顺序链表,而是(小-大-中)这种结构,所以我们就得先转换成(小-中-大),在抓住中间的向上提,这就有了所谓的先右旋转,再左旋转的操作。

  再来说删除,平衡二叉树在增加节点的时候会破坏平衡性,相反,删除的时候一样会破坏平衡,原理和增加节点差不多,删除叶子节点和只有一个子树的节点比较好理解,删掉,然后旋转就行了,如上面所说,复杂的是删除的节点左右都有子树,由于搜索二叉树的中序遍历得到的结果是一个从小到大的数组,那么删除某个元素的时候其实只需要将相邻的移除掉,这样一来还是能够建成为一颗平衡术,而相邻的节点必然是叶子节点或者只有左或者右子树的节点(这是由于排序的原理,仔细去思考一下,体会一下就明白了),所以又回到上面的节奏了,如果平衡被破坏,就旋转。

  这基本上就是AVL树的全部内容,我基本上是结合《大话数据结构》和http://blog.csdn.net/goodluckwhh/article/details/11786079这篇帖子来的。

  终归一句话,二叉树查找其实基本上是树的深度,所以我们要树变得很浅,很胖,而当出现不平衡的时候,我们要将其选择调整成为平衡树。

  这样来理解平衡二叉树相对来说要好理解一些。后面会分享一个白话的红黑树结构。

时间: 2024-10-26 00:25:28

白话平衡二叉树的相关文章

大话数据结构—平衡二叉树(AVL树)

平衡二叉树(Self-Balancing Binary Search Tree/Height-Balanced Binary Search Tree),是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1. 平衡二叉树的前提是二叉排序树,不是二叉排序树的都不是平衡二叉树. 平衡因子BF(Balance Factor):二叉树上节点的左子树深度减去右子树深度的值. 最小不平衡子树:距离插入节点最近的,且平衡因子的绝对值大于1的节点为根的子树. 下图中,新插入节点37时,距离它最近的平

Balanced Binary Tree(平衡二叉树)

来源:https://leetcode.com/problems/balanced-binary-tree Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never diff

平衡二叉树

1.基础知识 平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:1.它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树.2.其高度一般都良好地维持在O(log2n),大大降低了操作的时间复杂度.3.平衡二叉树的常用算法有红黑树.AVL.Treap等. 4.最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,可以参考Fibonacci数列,1是根节点,

数据结构—平衡二叉树

二叉排序树集中了数组的查找优势以及链表的插入.删除优势,因此在数据结构中占有一定的地位.但在一定的情况下二叉排序树又有可能变为链表,例如插入从1~100的数,这时进行数据查找的效率就要降低. 为了解决二叉排序树这种左右子树深度不均匀的情况引入了一种平衡二叉树(AVLTree):任何一个节点的左右子树深度差不超过1.通过这个限定,阻止了二叉树的左右子树深度差较大的情况,维持了二叉树的稳定. 如何让二叉树的左右子树深度差不超过1呢?这就需要对节点进行旋转,也就是当某个节点的左右子树深度超过1时需要对

软件架构上的白话理论

什么是白话? 今天我不陈述白话的又由来,也不陈述白话的概念,我们主要说白话到底是一个什么东西,我认为的白话的呢,通俗的讲就是大家都能听的懂得,不会产生歧义的.此话怎么讲呢?比如"你吃了么?"你绝对不会回答"我从北京来".这是明显的所问非所答.我所谓的白话,浅显通俗,在语言上,生动.泼辣.粗犷.生活气息浓厚,富有表现力.白话很容易表达自己所认为的东西,方便易懂.

二叉树的建立以及相关操作,平衡二叉树

二叉树的一些属性: int datdID;double data;TreeNode leftTree;TreeNode rightTree;TreeNode parent; //构建一个二叉树,将数据都放入了一个LIST里面    int selfID = 0;    public TreeNode creatTree(List<Double>datas,TreeNode tree){        if(datas.size()!=0){            TreeNode node =

第二篇:白话tornado源码之待请求阶段

上篇<白话tornado源码之一个脚本引发的血案>用上帝视角多整个框架做了一个概述,同时也看清了web框架的的本质,下面我们从tornado程序的起始来分析其源码. 概述 上图是tornado程序启动以及接收到客户端请求后的整个过程,对于整个过程可以分为两大部分: 启动程序阶段,又称为待请求阶段(上图1.2所有系列和3.0) 接收并处理客户端请求阶段(上图3系列) 简而言之: 1.在启 动程序阶段,第一步,获取配置文件然后生成url映射(即:一个url对应一个XXRequestHandler,

平衡二叉树的构树过程

1 package testStudy; 2 /**平衡因子枚举类*/ 3 enum BalanceFactor{ 4 LH("左子树高"),EH("左右等高"),RH("右子树高"); 5 6 private String illustration=""; 7 8 private BalanceFactor(String s){ 9 this.illustration=s; 10 } 11 12 public String

数据结构与算法系列----平衡二叉树(AVL树)

一:背景 平衡二叉树(又称AVL树)是二叉查找树的一个进化体,由于二叉查找树不是严格的O(logN),所以引入一个具有平衡概念的二叉树,它的查找速度是O(logN).所以在学习平衡二叉树之前,读者需要了解二叉查找树的实现,具体链接:二叉查找树 那么平衡是什么意思?我们要求对于一棵二叉查找树 ,它的每一个节点的左右子树高度之差不超过1.(对于树的高度的约定:空节点高度是0:叶子节点高度是1.)例如下图: 如果我们的二叉查找树是不平衡该怎么办?进行旋转.经过分析发现,出现不平衡无外乎四种情况,下面我