平衡二叉树

AVL树(平衡二叉树)

匆匆过客 提交于 2019-12-30 05:42:36
定义及性质   AVL树:AVL树是一颗自平衡的二叉搜索树.   AVL树具有以下性质:     根的左右子树的高度只差的绝对值不能超过1     根的左右子树都是 平衡二叉树(AVL树) 百度百科:   平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树(有别于AVL算法)     且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。     平衡二叉树的常用实现方法有 红黑树 、 AVL 、 替罪羊树 、 Treap 、 伸展树 等。        最小二叉平衡树的节点总数的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的 数列 ,        可以参考Fibonacci(斐波那契)数列,1是根节点,F(n-1)是左子树的节点数量,F(n-2)是右子树的节点数量。 AVL树--插入操作 AVL插入--旋转 代码实现 from bst import BST, BiTreeNode class AVLNode(BiTreeNode): def __init__(self, data): BiTreeNode.__init__(self, data) self.bf = 0 class AVLTree(BST): def __init__(self,

平衡二叉树

怎甘沉沦 提交于 2019-12-30 05:41:55
平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用实现方法有 红黑树 、 AVL 、 替罪羊树 、 Treap 、 伸展树 等。 最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的 数列 ,可以参考Fibonacci(斐波那契)数列,1是根节点,F(n-1)是左子树的节点数量,F(n-2)是右子树的节点数量。 关键在于他的平衡算法。 后续会继续研究 来源: https://www.cnblogs.com/yzjT-mac/p/6249812.html

二叉排序树和平衡二叉树的关系

好久不见. 提交于 2019-12-30 05:41:19
  二叉排序树: 二叉排序树又称二叉查找树,亦称二叉搜索树。 二叉排序树或者是一颗空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根节点的值; (2)若右子树不空,则右子树所有结点的值均大于或等于它的根结点的值; (3)左、右子树也分别为二叉排序树   平衡二叉树: 又称为AVL树,它具有以下特征: 它是一棵空树或它的左右两个子树的高度差(称为平衡因子)不大于1的二叉排序树,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用算法有红黑树、AVL、Treap等。 来源: https://www.cnblogs.com/smuxiaolei/p/7501051.html

图解平衡二叉树的构造过程(无算法)

时光毁灭记忆、已成空白 提交于 2019-12-30 00:55:35
平衡二叉树 前言:图片引自大话数据结构,写这篇博客是为了解答自己心中的疑惑,同时也希望能够帮助那些还不太懂平衡二叉树构造的朋友,一起加油! 准备知识: 左旋: 右旋: 有必要介绍一下 最小不平衡子树 : 构造平衡二叉树举例: 再来一道题练练手: 题目 :用输入序列(50,40,10,30,20,35)建立一棵平衡二叉树;画出该树的构造过程。 来源: CSDN 作者: weixin_45278641 链接: https://blog.csdn.net/weixin_45278641/article/details/103756409

数据结构之——平衡二叉树(内容详解)

杀马特。学长 韩版系。学妹 提交于 2019-12-29 20:10:50
一、基本概念 平衡二叉树也叫AVL树,它或者是一颗空树,或者具有以下性质的二叉排序树:它的左子树和左子树的高度之差(平衡因子)的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树。 二、结构 如基本概念所树,它具有一个左子树和一个左子树,且对于任意一个子树而言,左子树和右子树高度只差不超过1. 2.1 平衡二叉树判别 如下有3棵树,分别判断下哪个是平衡二叉树? 图1: 图2: 图3: 图一,很明显就能看出图1中任何子树的高度差都在没有超过1, 图二,节点25的左子树高度是3,而右子树高度是5,高度差已经超过1;对于节点32而言,左子树高度是3,右子树高度是1,高度差已经超出1,所以该树不是平衡二叉树。 图三,节点25的左子树高度是3,而右子树高度是5,高度差已经超过1,也不是平衡二叉树。 从上图这几个案例,应该能明白什么是平衡二叉树了吧。 首先,平衡二叉树是一个二叉搜索树,其次它每个子树的左右高度差都不超过一。 三、插入详解 对于平衡二叉树而言,当插入的新值导致它不是平衡二叉树了,这该怎么办? 插入新值前: 插入新值后: 如上图,本是平衡的,如果我插入了一个新值是30的节点,那么这棵树的平衡性就会被破坏,它一共破坏了节点32和节点25的平衡性,虽然破坏了2个节点的平衡性,但我们只讨论最近被破坏节点的平衡性(因为底下的处理好了,上面的节点平衡性也会随之处理好)

数据结构之平衡二叉树(AVL)

我们两清 提交于 2019-12-24 03:06:28
一:平衡二叉树特点: 平衡二叉树(Balanced binary tree)是由阿德尔森-维尔斯和兰迪斯(Adelson-Velskii and Landis)于1962年首先提出的,所以又称为AVL树。 定义:平衡二叉树或为空树,或为如下性质的二叉排序树: (1)左右子树深度之差的绝对值不超过1; (2)左右子树仍然为平衡二叉树. 平衡因子: BF=左子树深度-右子树深度. 平衡二叉树每个结点的平衡因子只能是1,0,-1。若其绝对值超过1,则该二叉排序树就是不平衡的。 二、平衡二叉树算法思想 若 向平衡二叉树中插入一个新结点后破坏了平衡二叉树的平衡性。首先要找出插入新结点后失去平衡的最小子树根结点的指针。然后再调整这个子树中有关结点之间的 链接关系,使之成为新的平衡子树。当失去平衡的最小子树被调整为平衡子树后,原有其他所有不平衡子树无需调整,整个二叉排序树就又成为一棵平衡二叉树。 失去平衡的最小子树是指以离插入结点最近,且平衡因子绝对值大于 1 的结点作为根的子树。假设用 A 表示失去平衡的最小子树的根结点,则调整该子树的操作可归纳为下列四种情况。 ( 1 ) LL 型平衡旋转法 由于在 A 的左孩子 B 的左子树上插入结点 F ,使 A 的平衡因子由 1 增至 2 而失去平衡。故需进行 一次顺时针旋转操作。 即将 A 的左孩子 B 向 右上旋转代替 A 作为根结点, A 向

二叉树之判断平衡二叉树

老子叫甜甜 提交于 2019-12-22 09:44:30
AVL树的名字来源于它的发明作者G.M. Adelson-Velsky 和 E.M. Landis。AVL树是最先发明的自平衡二叉查找树(Self-Balancing Binary Search Tree,简称平衡二叉树)。 平衡二叉树定义(AVL):它或者是一颗空树,或者具有以下性质的二叉排序树:它的左子树和右子树的深度之差(平衡因子)的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树。 如何判断一棵树是平衡二叉树? 最直接的做法,遍历每个结点,借助一个获取树深度的递归函数,根据该结点的左右子树高度差判断是否平衡,然后递归地对左右子树进行判断。 /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution { private boolean flag = true; public boolean is_Balance(TreeNode root) { getDepth(root); return flag; } public int getDepth(TreeNode root) { if(root == null)

平衡二叉树(AVL树)简单解析

倾然丶 夕夏残阳落幕 提交于 2019-12-21 10:10:32
平衡二叉树定义:二叉排序树的平衡因子绝对值小于等于1,即平衡因子为-1、0、1,那么是平衡二叉树(平衡因子:根结点的左子树深度减右子树深度的差)。 最小不平衡子树:子树的根结点距离插入结点距离最近,且平衡因子绝对值大于1的树为最小不平衡子树。 平衡二叉树:当插入结点后出现最小不平衡子树,那么就要对最小不平衡子树重新构造,通过顺时针(平衡因子皆为正)或逆时针(平衡因子皆为负)旋转最小不平衡子树的根结点使之成为平衡二叉树。注意:如果最小不平衡子树的根结点与页结点不是同号的,需要将其先转为同号再进行上述旋转(如何双旋转:如果最小不平衡树的根结点平衡因子为负数,说明其右子树深度高,为R,结点逆时针旋转;如果最小不平衡树的根结点右子树平衡因子为正数,说明其左子树深度高,为L,结点顺时针旋转;这样就形成了从上往下为RL,则先下子树L旋转,再上子树R旋转;反之为LR旋转)。 我们在处理平衡二叉树的时候回出现4中情况: LL型单旋转,顺时针旋转(新增结点在最小不平衡子树根的左子树的左子树下,L表示左子树,数字2表示平衡因子) LR型双旋转,先下后上旋转,先R逆时针选择,后L顺时针旋转(新增结点在最小不平衡子树根的左子树的右子树下,L表示左子树,数字2表示平衡因子) RR型单旋转,逆时针旋转(新增结点在最小不平衡子树根的右子树的右子树下,R表示右子树,数字-2表示平衡因子) RL型双旋转

平衡二叉树(AVL树)

感情迁移 提交于 2019-12-20 16:02:10
1.平衡二叉树:或者是一棵空的二叉排序树,或者是具有下列性质的二叉排序树: ⑴ 根结点的左子树和右子树的深度最多相差1; ⑵ 根结点的左子树和右子树也都是平衡二叉树。 2.平衡因子:结点的平衡因子是该结点的左子树的深度与右子树的深度之差。 3.结点的平衡因子=HL-HR 4.在平衡树中,结点的平衡因子可以是1,0,-1。 5.最小不平衡子树:在平衡二叉树的构造过程中,以距离插入结点最近的、且平衡因子的绝对值大于1的结点为根的子树。 基本思想: 在构造二叉排序树的过程中,每插入一个结点时,首先检查是否因插入而破坏了树的平衡性,若是,则找出最小不平衡子树,在保持二叉排序树特性的前提下,调整最小不平衡子树中各结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树。 设结点A为最小不平衡子树的根结点,对该子树进行平衡调整归纳起来有以下四种情况: LL型 RR型 LR型 RL型 LL B = A - > lchild; A - > lchild = B - > rchild; B - > rchild = A; A - > bf = 0 ; B - > bf = 0 ; if ( FA == NULL ) root = B ; else if ( A == FA - > lchild ) FA - > lchild = B ; else FA - > rchild = B; RR B =

平衡二叉树【旋转的超详细图解】

断了今生、忘了曾经 提交于 2019-12-20 04:17:31
平衡二叉树 1、定义: 平衡二叉树,是一种二叉排序树,其中每个节点的左子树和右子树相差的高度不超过1。它是一种高度平衡的二叉排序树。高度平衡:意思是说,要么它是一颗空树,要么它的左子树和右子树都是平衡二叉树。 平衡二叉树的出现是为了优化二叉顺序树的查找效率,你可以想象下,二叉顺序树如果顺序添加一个这样的数据{5,4,3,2,1},那么树成了一个链表,查找效率显然不高 。 平衡二叉树首先是一个二叉顺序树,只不过他在每次添加数据的时候会进行自我平衡,来优化查找的效率。 2、术语: 最小不平衡子树: 指离插入节点最近且以平衡因子的绝对值大于1的节点作为根的子树。 平衡因子(bf): 结点的左子树的深度减去右子树的深度,那么显然-1<=bf<=1; 3、插入操作 在平衡二叉树中插入结点与二叉查找树最大的不同在于要随时保证插入后整棵二叉树是平衡的。那么调整不平衡树的基本方法就是: 旋转 。 4、我理解的旋转 旋转是为了解决平衡树的失衡,如何做呢?即将子树高的一边中的一些节点调整到另一边,(并不只是把一边的节点给移到另一边,只是总体看上去,高的一边变矮了。)调整时需要保持树依然 是有序的。 上面这颗树明显已经不是平衡数,根节点50的平衡因子(bf) 3 -1 > 1 ,此时我们需要调整该树让其再一次到达平衡。我们先把树拆成两部分。如下 第一部分 :根节点深度大的子树 第二部分