什么是树?
答:树是n个结点的集合。
什么是森林?
答:n棵互不相交的树组成的集合叫森林。
结点的度指什么?
答:结点拥有的子树的数量。
树的高度(深度)指什么?
答:树中结点的最大层次。
树的平均深度是多少?
答:O(logN)。
什么是二叉树?
答:二叉树是一棵树,其每个结点的子结点数最多为2。
什么是二叉查找树(ADT)?
答:二叉查找树是一棵树,其左子树中所有结点的值都小于根结点,其右子树中所有结点的值都大于根结点。
二叉查找树就保证了元素的有序性。
什么是平衡二叉查找树(AVL)?
答:AVL是带有平衡条件的二叉查找树。其每个结点的左子树和右子树的高度差最多为1。
平衡二叉查找树(AVL)在二叉查找树的基础上加平衡条件,是为了防止在查找的时候,二叉查找树的层次过深。
当向AVL树中插入或删除元素时,可能会破坏平衡条件,解决办法是旋转。旋转分四种情况:LL型平衡旋转、RR型平衡旋转、LR型平衡旋转、RL型平衡旋转,这四种旋转又可概括为两种:单旋转和双旋转。假如在向AVL树中插入或删除元素时,破坏了AVL的平衡性,就需要通过旋转来调整,使之重新平衡。
什么是红黑树?
答:首先,红黑树是二叉查找树,在二叉查找树的基础上,增加了一些特性。
二叉查找树按照一定顺序存储元素,这使得在查找元素时变得方便,其平均深度为O(logN)。但是二叉查找树的问题在于,其性能严重地依赖于输入,而输入却是随机的。如果情况不是这样,则运行时间会显著增加,二叉查找树会成为昂贵的链表。
平衡二叉查找树(AVL)就是用来解决二叉查找树的问题的,它要求所有结点的左子树和右子树的高度差最多为1,这就保证了树不至于太深。但是平衡二叉查找树(AVL)对平衡的要求太严苛,以至于插入和删除操作时,非常容易破坏平衡条件,会引起频繁的平衡调整,导致效率下降。
红黑树就是一种折中选择,它既能起到平衡的作用,使二叉查找树的深度不至于太深,又不像平衡二叉查找树(AVL)那样严苛,它追求的是二叉查找树的局部平衡,就算在插入和删除操作,也不会那么容易就破坏掉红黑树的平衡条件,效率较AVL来说,比较高。
红黑树是具有着色性质的二叉查找树,其特性如下:
答:1.每一个节点要么着成红色,要么着成黑色。
2.根是黑色的。
3.如果一个节点是红色,那么它的子节点必须是黑色的。
4.从一个节点到一个null引用的每一条路径必须包含相同数目的黑色节点。
1. 树的遍历方式有几种?
答:3种。分别是先序遍历、中序遍历和后序遍历。
2. 二叉查找树的平均深度是多少?
答:O(logN)。
3. 什么是二叉查找树(ADT)?什么是平衡二叉树(AVL)?什么是红黑树?三者之间有什么区别?
答:二叉查找树是一棵二叉树,其左子树中所有结点的值都小于根结点,其右子树中所有结点的值都大于根结点。
平衡二叉查找树(AVL)是在二叉查找树的基础上加平衡条件,其每个结点的左子树和右子树的高度差最多为1。
红黑树也是在二叉查找树的基础上加平衡条件,但是它的平衡条件并不像AVL那样严苛,红黑树满足如下性质:
1.每一个节点要么着成红色,要么着成黑色。
2.根是黑色的。
3.如果一个节点是红色,那么它的子节点必须是黑色的。
4.从一个节点到一个null引用的每一条路径必须包含相同数目的黑色节点。
区别:
二叉查找树按照一定顺序存储元素,这使得在查找元素时变得方便,其平均深度为O(logN)。但是二叉查找树的问题在于,其性能严重地依赖于输入,而输入却是随机的。如果情况不是这样,则运行时间会显著增加,二叉查找树会成为昂贵的链表。
平衡二叉查找树(AVL)就是用来解决二叉查找树的问题的,它要求所有结点的左子树和右子树的高度差最多为1,这就保证了树不至于太深。但是平衡二叉查找树(AVL)对平衡的要求太严苛,以至于插入和删除操作时,非常容易破坏平衡条件,会引起频繁的平衡调整,导致效率下降。
红黑树就是一种折中选择,它既能起到平衡的作用,使二叉查找树的深度不至于太深,又不像平衡二叉查找树(AVL)那样严苛,它追求的是二叉查找树的局部平衡,就算在插入和删除操作,也不会那么容易就破坏掉红黑树的平衡条件,效率较AVL来说,比较高。
4. 二叉查找树添加元素时的逻辑是怎样的?
答:首先,判断该树是否为null,若为null,将元素添加到根结点的位置;若不为null,继续判断。若元素小于当前结点元素,向左放,若元素大于当前结点元素,向右放,若元素等于当前结点元素,不放(去重复的情况下,若不去重复,用链表来存储这些重复的元素)。最后遍历到当前结点.left=null或当前结点.right=null时,将元素添加到当前结点的左子节点或当前结点的右子节点位置即可。
5. 二叉查找树删除元素时的逻辑是怎样的?
答:如果节点是叶子结点,可以直接删除。
如果节点有一个子节点,则将父节点直接指向其子节点。
如果节点有两个子节点(最为复杂),用其右子树中的最小的数据代替该节点的数据并递归地删除那个节点。
红黑树
要学习红黑树,首先要理解二叉查找树(Binary Search Tree)。
二叉查找树(BST)具备什么特性呢?
- 左子树上所有结点的值均小于或等于它的根结点的值。
- 右子树上所有结点的值均大于或等于它的根结点的值。
- 左、右子树也分别为二叉查找树。
利用二叉查找树的思想,查找所需的最大次数等同于二叉查找树的高度,优化了查询的时间复杂度。但是二叉查找树查找性能严重依赖于输入,而输入却是随机的,在极端情况下,二叉查找树会成为昂贵的链表。
如何解决二叉查找树可能存在的性能问题呢?红黑树应运而生了!
红黑树(Red Black Tree)是一种自平衡的二叉查找树。除了符合二叉查找树的基本特性外,它还具有下列的附加特性:
- 每一个节点要么着成红色,要么着成黑色。
- 根结点是黑色的。
- 每个叶子结点都是黑色的空节点。
- 如果一个节点是红色的,那么它的子节点必须是黑色的。
- 从任一节点到其每个叶子节点的所有路径都包含相同数目的黑色节点。
当向红黑树插入或删除节点的时候,红黑树的规则有可能被打破。这时候就需要做出一些调整,来继续维持我们的规则。
什么情况下会破坏红黑树的规则,什么情况下不会破坏规则呢?
每次新插入的节点都标记为红色,当插入节点的父节点为黑色时,不会破坏红黑树的规则;当插入节点的父节点为红色时,会破坏红黑树的规则。
调整有两种方法:变色和旋转。而旋转又分成两种形式:[左旋转]和[右旋转]。
变色:
为了重新符合红黑树的规则,尝试把红色节点变为黑色,或者把黑色节点变为红色。
左旋转:
逆时针旋转红黑树的两个节点,使得父节点被自己的右孩子取代,而自己成为自己的左孩子。
右旋转:
顺时针旋转红黑树的两个节点,使得父节点被自己的左孩子取代,而自己成为自己的右孩子。
具体什么时候用变色?什么时候用旋转?要视情况而定!
红黑树在哪些地方被实际用到呢?
答:红黑树的应用有很多,其中JDK的集合类TreeMap和TreeSet底层就是红黑树实现的。在Java8中,连HashMap也用到了红黑树(当HashMap中存放哈希值冲突元素的链表长度超过8以后,会转成红黑树,以提高查询性能)。
B+树
问:Mysql数据库用过吧?里面的索引是基于什么数据结构?
答:索引主要是基于Hash表或者B+树。
问:很好,请你说一说B+树的实现细节是什么样?为什么不用二叉查找树而用B+树呢?好处是什么?
答:其实从算法逻辑上来讲,二叉查找树的查找速度和比较次数都是最少的。但是,我们不得不考虑一个现实问题:磁盘IO。数据库索引是存储在磁盘上的,当数据量比较大的时候,索引的大小可能有几个G甚至更多。当我们利用索引查询的是偶,能把整个索引全部加载到内存吗?显然不可能。能做的只有逐一加载每一个磁盘页,这里的磁盘页对应着索引树的节点。
磁盘的IO数与什么有关呢?
最坏情况下,磁盘的IO次数等于索引树的高度。二叉查找树的高度是随着数据的增加而不断增加的,是“瘦高”型的树,为了减少磁盘IO次数,我们就需要把原本“瘦高”的树结构变得“矮胖”,而B+树是“矮胖型”的树,它的高度是可以控制的。
B+树的特征:
- 有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。
- 所有的叶子结点中包含了全部元素的信息,即指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
- 所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。
B+树的优势:
- B+树的每一个节点都可以存储更多的元素,使B+树的高度可控,查询磁盘IO次数更少,查询速度比二叉查找树和B-树都要快。
- 所有查询都要查找到叶子节点,查询性能稳定。
- 所有叶子节点以链表的形式相关联,便于范围查找。