二叉树
介绍:二叉搜索树
- 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
- 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
- 任意节点的左、右子树也分别为二叉查找树;
- 没有键值相等的节点。
1 | # coding: utf-8 |
堆
介绍:堆
支持的基本操作
操作 | 描述 | 时间复杂度 |
---|---|---|
build | 创建一个空堆 | {\displaystyle O(n)} |
insert | 向堆中插入一个新元素 | {\displaystyle O(\log n)} |
update | 将新元素提升使其匹配堆的性质 | |
get | 获取当前堆顶元素的值 | {\displaystyle O(1)} |
delete | 删除堆顶元素 | {\displaystyle O(\log n)} |
heapify | 使删除堆顶元素的堆再次成为堆 |
小顶堆及排序
使用list模拟
- 根节点位置:根节点的数据总是在数组的位置[0]
- 节点的父节点位置:假设一个非根节点的数据在数组中的位置[i],那么它的父节点总是在位置[(i-1)/2]
- 节点的孩子节点位置:假设一个节点的数据在数组中的位置为[i],那么它的孩子(如果有)总是在下面的这两个位置:左孩子在[2i+1],右孩子在[2i+2]
1 | # coding:utf-8 |
大顶堆及排序
1 | # coding:utf-8 |
优先级队列
优先级队列和通常的栈和队列一样,只不过里面的每一个元素都有一个”优先级”,在处理的时候,首先处理优先级最高的。如果两个元素具有相同的优先级,则按照他们插入到队列中的先后顺序处理。
优先级队列可以通过链表,数组,堆或者其他数据结构实现。
· 如果使用无序数组,那么每一次插入的时候,直接在数组末尾插入即可,时间复杂度为O(1),但是如果要获取最大值,或者最小值返回的话,则需要进行查找,这时时间复杂度为O(n)。
· 如果使用有序数组,那么每一次插入的时候,通过插入排序将元素放到正确的位置,时间复杂度为O(n),但是如果要获取最大值的话,由于元阿苏已经有序,直接返回数组末尾的 元素即可,所以时间复杂度为O(1).
所以采用普通的数组或者链表实现,无法使得插入和排序都达到比较好的时间复杂度。所以我们需要采用新的数据结构来实现。下面就开始介绍如何采用二叉堆(binary heap)来实现优先级队列
利用优先级队列合并 K 个有序数组
求一组动态数据集合的最大 Top K
对应的 LeetCode 练习题
Invert Binary Tree(翻转二叉树)
英文版:https://leetcode.com/problems/invert-binary-tree/
中文版:https://leetcode-cn.com/problems/invert-binary-tree/
Maximum Depth of Binary Tree(二叉树的最大深度)
英文版:https://leetcode.com/problems/maximum-depth-of-binary-tree/
中文版:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/
Validate Binary Search Tree(验证二叉查找树)
英文版:https://leetcode.com/problems/validate-binary-search-tree/
中文版:https://leetcode-cn.com/problems/validate-binary-search-tree/
Path Sum(路径总和)