算法相关数据结构总结:
序号 | 数据结构 | 文章 |
---|---|---|
1 | 动态规划 | 动态规划之背包问题——01背包 动态规划之背包问题——完全背包 动态规划之打家劫舍系列问题 动态规划之股票买卖系列问题 动态规划之子序列问题 算法(Java)——动态规划 |
2 | 数组 | 算法分析之数组问题 |
3 | 链表 | 算法分析之链表问题 算法(Java)——链表 |
4 | 二叉树 | 算法分析之二叉树 算法分析之二叉树遍历 算法分析之二叉树常见问题 算法(Java)——二叉树 |
5 | 哈希表 | 算法分析之哈希表 算法(Java)——HashMap、HashSet、ArrayList |
6 | 字符串 | 算法分析之字符串 算法(Java)——字符串String |
7 | 栈和队列 | 算法分析之栈和队列 算法(Java)——栈、队列、堆 |
8 | 贪心算法 | 算法分析之贪心算法 |
9 | 回溯 | Java实现回溯算法入门(排列+组合+子集) Java实现回溯算法进阶(搜索) |
10 | 二分查找 | 算法(Java)——二分法查找 |
11 | 双指针、滑动窗口 | 算法(Java)——双指针 算法分析之滑动窗口类问题 |
二叉树的基础知识已经在上一篇文章算法分析之二叉树学习过了,这篇文章主要是二叉树的遍历方式,包括递归和迭代版本。
二叉树的相关算法,如属性,操作,二叉搜索树等,请参考:算法分析之二叉树常见问题。
文章目录
一、二叉树的遍历
二叉树的遍历方式主要有两种:
- 深度优先遍历(DFS):前序、中序、后续遍历
- 广度优先遍历(BFS):层序遍历
leetcode相关题目:
二、二叉树的递归遍历
先写一下递归的三要素:
-
确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。
-
确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。
-
确定单层递归的逻辑: 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。
1. 二叉树的前序遍历
前序遍历:根左右
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
// 递归版本
ArrayList<Integer> res = new ArrayList<>();
preOrder(root, res);
return res;
}
public void preOrder(TreeNode root, ArrayList<Integer> res) {
if(root == null) return;
res.add(root.val);
preOrder(root.left, res);
preOrder(root.right, res);
}
}
2. 二叉树的中序遍历
中序遍历:左根右
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
// 递归版本
ArrayList<Integer> res = new ArrayList<>();
inOrder(root, res);
return res;
}
public void inOrder(TreeNode root, ArrayList<Integer> res) {
if(root == null) return;
inOrder(root.left, res);
res.add(root.val);
inOrder(root.right, res)