力扣算法 Java 刷题笔记【二叉树篇】hot100(十二)前序、中序、后序遍历二叉树(递归 & 迭代)3*2
2021/12/15 17:20:23
本文主要是介绍力扣算法 Java 刷题笔记【二叉树篇】hot100(十二)前序、中序、后序遍历二叉树(递归 & 迭代)3*2,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
文章目录
- 1. 二叉树的前序遍历
- 2. 二叉树的中序遍历(简单)
- 3. 二叉树的后序遍历
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
1. 二叉树的前序遍历
地址: https://leetcode-cn.com/problems/binary-tree-preorder-traversal/
2021/12/10
方法一: 递归
做题反思:
方法二: 迭代
做题反思:
2. 二叉树的中序遍历(简单)
地址: https://leetcode-cn.com/problems/binary-tree-inorder-traversal/
2021/12/15
方法一: 递归
做题反思:List 是一个接口, 创建对象时用他的实现类 -> ArrayList 或者 LinkedList
二叉树经典递归框架
labuladong 回溯算法思路
class Solution { public List<Integer> inorderTraversal(TreeNode root) { traverse(root); return inorder; } List<Integer> inorder = new ArrayList<>(); void traverse(TreeNode root) { if (root == null) { return; } traverse(root.left); inorder.add(root.val); traverse(root.right); } }
class Solution { List<Integer> inorder = new ArrayList<>(); public List<Integer> inorderTraversal(TreeNode root) { if (root == null) { return new ArrayList<>(); } inorderTraversal(root.left); inorder.add(root.val); inorderTraversal(root.right); return inorder; } }
方法二: 迭代
做题反思:
class Solution { Stack<TreeNode> stk = new Stack<>(); public List<Integer> inorderTraversal(TreeNode root) { TreeNode visited = new TreeNode(-1); List<Integer> inorder = new ArrayList<>(); pushLeftBatch(root); while (!stk.isEmpty()) { TreeNode p = stk.peek(); if ((p.left == null || p.left == visited) && p.right != visited) { inorder.add(p.val); pushLeftBatch(p.right); } if (p.right == null || p.right == visited) { visited = stk.pop(); } } return inorder; } void pushLeftBatch(TreeNode root) { while (root != null) { stk.push(root); root = root.left; } } }
方法三:labuladong 动态规划思路
class Solution { public List<Integer> inorderTraversal(TreeNode root) { List<Integer> list = new ArrayList<>(); if (root == null) { return list; } list.addAll(inorderTraversal(root.left)); list.add(root.val); list.addAll(inorderTraversal(root.right)); return list; } }
3. 二叉树的后序遍历
地址: https://leetcode-cn.com/problems/binary-tree-postorder-traversal/
2021/12/10
方法一: 递归
做题反思:
方法二: 迭代
做题反思:
-
stack.peek()
参数:该方法不带任何参数。
返回值:该方法返回栈顶元素,如果栈为空则返回NULL。 -
stack.pop()
参数:该方法不带任何参数。
返回值:此方法返回存在于堆栈顶部的元素,然后将其删除。 -
stack.push( E 元素)
参数:该方法接受一个Stack 类型的参数元素,并引用要压入堆栈的元素。
返回值:该方法返回传递的参数。
任何一个二叉树的算法,如果你想把递归改成迭代,都可以套用这个框架,只要把递归的前中后序位置的代码对应过来就行了。
迭代解法到这里就搞定了,不过我还是想强调,除了 BFS 层级遍历之外,二叉树的题目还是用递归的方式来做,因为递归是最符合二叉树结构特点的。
说到底,这个迭代解法就是在用栈模拟递归调用,所以对照着递归解法,应该不难理解和记忆。
理论上,所有递归算法都可以利用栈改成迭代的形式,因为计算机本质上就是借助栈来迭代地执行递归函数的。
https://labuladong.gitee.io/algo/2/18/32/
这篇关于力扣算法 Java 刷题笔记【二叉树篇】hot100(十二)前序、中序、后序遍历二叉树(递归 & 迭代)3*2的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-26Mybatis官方生成器资料详解与应用教程
- 2024-11-26Mybatis一级缓存资料详解与实战教程
- 2024-11-26Mybatis一级缓存资料详解:新手快速入门
- 2024-11-26SpringBoot3+JDK17搭建后端资料详尽教程
- 2024-11-26Springboot单体架构搭建资料:新手入门教程
- 2024-11-26Springboot单体架构搭建资料详解与实战教程
- 2024-11-26Springboot框架资料:新手入门教程
- 2024-11-26Springboot企业级开发资料入门教程
- 2024-11-26SpringBoot企业级开发资料详解与实战教程
- 2024-11-26Springboot微服务资料:新手入门全攻略