二叉树的学习(二)

101 阅读3分钟

这是我参与更文挑战的第 4 天,活动详情查看: 更文挑战

关于二叉树和堆的 7 个必知必会的代码实现

二叉树

leetcode: 102,107 二叉树层序遍历 用同样的算法 leetcode: 98 是否为合法的二叉查找树,结合中序遍历进行解答,中序遍历在二叉查找树就是顺序输出 Leetcode: 104 二叉树的最大深度 使用层序遍历也可以,或者递归(三元表达式)

Leetcode: 111 树的最小深度,类似于求树的最大深度,但是要主要这个最小深度的定义。 Leetcode 94 二叉树的中序遍历,输出 List<Interger> 解法一:递归 解法二:通过栈

  1. 每拿到一个节点,就把它保存在栈中
  2. 继续对这个节点的 左子树 重复 过程1,直到左子树为 空
  3. 因为保存在 栈 中的节点都遍历了 左子树,所以对栈中节点 出栈,然后将节点加入结果集list中,并对它的 右子树 重复 过程1
  4. 直到遍历完所有节点

Leetcode 144 二叉树的前序遍历 输出 List<Interger> 解法一:递归 解法二:通过栈

  1. 每拿到一个 节点 就把它保存在 栈中,并把它加入结果集list中
  2. 继续对这个节点的 左子树 重复 过程1,直到左子树为 空
  3. 因为保存在 栈 中的节点都遍历了 左子树 但是没有遍历 右子树,所以对栈中节点 出栈 并对它的 右子树 重复 过程1
  4. 直到遍历完所有节点

Leetcode 145 二叉树的后序遍历 输出 List<Interger> 解法一:递归 解法二:通过栈,

​ 前序遍历顺序为:根 -> 左 -> 右

​ 后序遍历顺序为:左 -> 右 -> 根

​ 如果1: 我们将前序遍历中节点插入结果链表尾部的逻辑,修改为将节点插入结果链表的头部

​ 那么结果链表就变为了:右 -> 左 -> 根

​ 如果2: 我们将遍历的顺序由从左到右修改为从右到左,配合如果1

​ 那么结果链表就变为了:左 -> 右 -> 根(遍历的顺序由从左到右修改为从右到左,这个时候变为 根 -> 右 -> 左;配 合如果1,变为 左 -> 右 ->根)

​ 这刚好是后序遍历的顺序

树的递归技巧

  • 写出结束条件

  • 不要把树复杂化,就当做树是三个节点,根节点,左子节点,右子节点

  • 只考虑当前做什么,不用考虑下次应该做什么

  • 每次调用应该返回什么

实现一个二叉查找树,并且支持插入、删除、查找操作

实现查找二叉查找树中某个节点的后继、前驱节点

实现二叉树前、中、后序以及按层遍历

实现一个小顶堆、大顶堆、优先级队列

实现堆排序

利用优先级队列合并 K 个有序数组

求一组动态数据集合的最大 Top K