先插入一些关于树的有关知识,完美二叉树,完全二叉树等,为之后学习AVL树,红黑树做点准备。
未解决:
问题1:如何用avl实现其他的数据结构
问题2:如果是avl树旋转了的话,那么搜索等结构还怎么做呢?就不再是小于走left,大于走right了吗?
问题3:红黑树的具体实现和目的
问题4:关于各种排序的时间复杂度以及排序。
先引入关于树的知识:
添加一个:度为0的节点和度为2的节点的关系是什么?
能够回答这17个问题是关键。
(1) 2的i次方个 (相当于等比数列)
(2)
Key:这里也就是等比数列求和,求和的意思是:前n项和,因为从0开始的时候,已经是1项了,所以是n+1项
(3)度:结点的子树个数(就是说:某个节点的度 不然就是0 不然就是1 不然就是2) 度分为节点的度和树的度,树的度:意思是所有节点的最大的度
key:也就是注意概念:节点的度和树的度的区别,节点的XX和树的XX,树一般作为统计概念,统计其中最大的
(4)入度和出度是什么概念,入度和出度是图的概念,树是度的概念。
这里讲的是节点V0的入度是2,出度是1. 入V0和出V0,记住,节点的度就是它的子树的个数就对了。
(5)二叉树,每个节点的子树最多有两颗,就是二叉树。 key:因为树的度是2,所以意思是最大的话是2.
(6)完全二叉树 完美二叉树
意思是:完全二叉树可以最后一层 不完全,完美二叉树一定要到完美境界,最后一层也要完全。
(7)
我自己认为:二叉搜索树可以不是完全二叉树(原因:如果说它一直是比它小的结构,例如图上),那么的话就不是完全二叉树了。 那么不是完全二叉树,也就不是完美二叉树了。
但是它也可以是完全二叉树
(8)AVL树:自平衡的二叉搜索树,在AVL中任何节点的两个儿子子树的高度最大差别为1,所以它也被称为高度平衡树。
引入avl树的目的: 它是特殊的二叉搜索树 对于bst而言,它搜索、插入、删除的时间复杂度,其实插入和删除都是要基于这个搜索的,所以说logN的时间复杂度
由于未必满足向左对齐这个特点 所以说avl树也未必是完全二叉树。
(9)所以它也被称为高度平衡树,n个结点的AVL树最大深度约1.44log2n。查找、插入和删除在平均和最坏情况下都是O(logn)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)。但是频繁旋转会使插入和删除牺牲掉O(logN)左右的时间,不过相对二叉查找树来说,时间上稳定了很多。
这里说的是AVL树目的,在最坏情况下将查找、插入删除的时间复杂度降为logN
(10)红黑树:
红黑树应用比较广泛:
1.广泛用在C++
的STL
中。map
和set
都是用红黑树实现的。
2.著名的linux
进程调度Completely Fair Scheduler
,用红黑树管理进程控制块。
3.epoll
在内核中的实现,用红黑树管理事件块
4.nginx
中,用红黑树管理timer
等
原因:
红黑树的查询性能略微逊色于AVL
树,因为比AVL
树会稍微不平衡最多一层,也就是说红黑树的查询性能只比相同内容的AVL
树最多多一次比较,但是,红黑树在插入和删除上完爆AVL
树,AVL
树每次插入删除会进行大量的平衡度计算,而红黑树为了维持红黑性质所做的红黑变换和旋转的开销,相较于AVL
树为了维持平衡的开销要小得多
性质:
1.节点是红色或黑色。
2.根节点是黑色。
3.每个叶子节点都是黑色的空节点(NIL节点)。
4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
(12)用avl树去实现其他数据结构的目的的话,我个人认为:像Queue可以去用linkedList 是On的复杂度 stack可以用deque,set的话其实也是用linkedList可以实现,直接在头部添加即可。
avl树去实现其他东西的目的,是为了减小其他的东西的搜索、添加、删除的时间复杂度吧。
(13)一个节点,除了根之外(所以那时候,也可以用index而不是parentIndex来做siftUp的出口),都有一个父节点(有且仅有)
(14)从节点n1到节点n2 所需要经历的节点的路径。(也就是说两个节点之间可能路径是带权的嘛,所以说路径的总和)
(15)规定根结点在0层,其他任一结点的层数是其父节点的层数加1
(16)树的深度,是所有节点层次的最大值。
(17)度为0的节点和度为2的节点的关系
来源:https://www.cnblogs.com/startFrom0/p/12637933.html