标签:最大堆 generate htm 避免 平衡树 9.png 图解 完全二叉树 bubuko
12.1?堆:
最小堆(minheap) : 每一结点小于或等于其两个孩子;其根的两个孩子同样为最小堆。
最大堆(maxheap) : 每一结点大于或等于其两个孩子;其根的两个孩子同样为最大堆。
元素相同,构造的堆也可以不同:
操作 | 说明 |
---|---|
addElement | 将给定元素添加到该堆中 |
removeMin | 删除堆的最小元素 |
findMin | 返回一个指向堆中最小元素的引用 |
11.2?用链表实现二叉查找树
11.2.1?addElement操作:
若右孩子为空,新元素成为根的右孩子;若右孩子不为空,则遍历根的右孩子,再次进行比较操作。
11.2.2?removeElement操作:
3.若被删除的结点有两个孩子,则replacement返回中序遍历中的后继者。
11.2.3?removeAllOccurrences操作:
反复调用removeElement方法来删除某一指定元素的所有存在。
11.2.4?removeMin操作:
3.若树的最左侧结点是一个内部结点,则需要设置其父结点的左孩子引用指向这个将删除结点的右孩子。
11.3?用有序列表实现二叉查找树
操作 | 描述 |
---|---|
removeFirst | 从列表中删除第一个元素 |
removeLast | 从列表中删除最后一个元素 |
remove | 从列表中删除某个元素 |
first | 查看位于列表前端的元素 |
last | 查看位于列表末端的元素 |
contains | 确定列表是否含有某一个元素 |
isEmpty | 判定列表是否为空 |
size | 确定列表中的元素数量 |
操作 | 描述 |
---|---|
add | 向列表中添加一个元素 |
11.3.1?BinarySearchTree实现的分析:
操作 | LinkedList | BinarySearchTreeList |
---|---|---|
removeFirst | O(1) | O(log n) |
removeLast | O(n) | O(log n) |
remove | O(n) | O(log n)* |
first | O(1) | O(log n) |
last | O(n) | O(log n) |
contains | O(n) | O(log n) |
isEmpty | O(1) | O(1) |
size | O(1) | O(1) |
add | O(n) | O(log n) * |
add操作和remove操作都可能导致树变得不平衡 |
其看起来更像是一个链表,然而其效率却比链表还低,其附带了额外的开销。
若无平衡假设,则最坏情况下addElement操作的时间复杂度为O(n)而不是O(log n),树根是最小元素,而即将被插入的元素可能成为树中的最大元素。
左孩子绕着其父结点向右旋转;
旋转前,x是p的左儿子。x的右儿子(若存在)变为p的左儿子,p变为x的右儿子。
旋转前,x是p的右儿子。x的左儿子(若存在)变为p的右儿子,p变为x的左儿子。
11.4.3?右左旋(rightleft rotation):
11.4.3?左右旋(leftright rotation):
11.5?实现二叉查找树:AVL树
3.每个节点都有一个平衡因子(balance factor),任一节点的平衡因子是-1,0,1。(每个节点的平衡因子等于右子树的高度减去左子树的高度 )
11.6?实现二叉查找树:红黑树
问题1:如何删除某一指定结点的子树。
解决:
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | |
---|---|---|---|
目标 | 3000行 | 15篇 | 300小时 |
第一周 | 0/0 | 1/1 | 12/12 |
第二周 | 935/935 | 1/2 | 24/36 |
第三周 | 849/1784 | 1/3 | 34/70 |
第四周 | 3600/5384 | 1/5 | 50/120 |
第五周 | 2254/7638 | 1/7 | 50/170 |
第六周 | 2809/10447 | 1/9 | 45/215 |
第七周 | 3700/14147 | 1/10 | 40/255 |
标签:最大堆 generate htm 避免 平衡树 9.png 图解 完全二叉树 bubuko
原文地址:https://www.cnblogs.com/Tangcaiming/p/9940677.html