这是我参与更文挑战的第 4 天,活动详情查看: 更文挑战
关于二叉树和堆的 7 个必知必会的代码实现
二叉树
leetcode: 102,107 二叉树层序遍历 用同样的算法 leetcode: 98 是否为合法的二叉查找树,结合中序遍历进行解答,中序遍历在二叉查找树就是顺序输出 Leetcode: 104 二叉树的最大深度 使用层序遍历也可以,或者递归(三元表达式)
Leetcode: 111 树的最小深度,类似于求树的最大深度,但是要主要这个最小深度的定义。
Leetcode 94 二叉树的中序遍历,输出 List<Interger> 解法一:递归 解法二:通过栈
- 每拿到一个节点,就把它保存在栈中
- 继续对这个节点的 左子树 重复 过程1,直到左子树为 空
- 因为保存在 栈 中的节点都遍历了 左子树,所以对栈中节点 出栈,然后将节点加入结果集list中,并对它的 右子树 重复 过程1
- 直到遍历完所有节点
Leetcode 144 二叉树的前序遍历 输出 List<Interger> 解法一:递归 解法二:通过栈
- 每拿到一个 节点 就把它保存在 栈中,并把它加入结果集list中
- 继续对这个节点的 左子树 重复 过程1,直到左子树为 空
- 因为保存在 栈 中的节点都遍历了 左子树 但是没有遍历 右子树,所以对栈中节点 出栈 并对它的 右子树 重复 过程1
- 直到遍历完所有节点
Leetcode 145 二叉树的后序遍历 输出 List<Interger> 解法一:递归 解法二:通过栈,
前序遍历顺序为:根 -> 左 -> 右
后序遍历顺序为:左 -> 右 -> 根
如果1: 我们将前序遍历中节点插入结果链表尾部的逻辑,修改为将节点插入结果链表的头部
那么结果链表就变为了:右 -> 左 -> 根
如果2: 我们将遍历的顺序由从左到右修改为从右到左,配合如果1
那么结果链表就变为了:左 -> 右 -> 根(遍历的顺序由从左到右修改为从右到左,这个时候变为 根 -> 右 -> 左;配 合如果1,变为 左 -> 右 ->根)
这刚好是后序遍历的顺序
树的递归技巧
-
写出结束条件
-
不要把树复杂化,就当做树是三个节点,根节点,左子节点,右子节点
-
只考虑当前做什么,不用考虑下次应该做什么
-
每次调用应该返回什么
实现一个二叉查找树,并且支持插入、删除、查找操作
实现查找二叉查找树中某个节点的后继、前驱节点
实现二叉树前、中、后序以及按层遍历
堆
实现一个小顶堆、大顶堆、优先级队列
实现堆排序
利用优先级队列合并 K 个有序数组
求一组动态数据集合的最大 Top K