算法刷刷刷|二叉树篇|二叉树的遍历
144.二叉树的前序遍历
递归:
import java.util.*;public class Solution {class TreeNode {int val;TreeNode left;TreeNode right;public TreeNode() {}public TreeNode(int val) {this.val = val;}public TreeNode(int val, TreeNode left, TreeNode right) {this.val = val;this.left = left;this.right = right;}}public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();reverse(root, res);return res;}private void reverse(TreeNode root, List<Integer> res) {if (root == null) {return;}res.add(root.val);reverse(root.left, res);reverse(root.right, res);}
}
树的中序、前序、后序遍历递归、迭代遍历法时间复杂度和空间复杂度分析:
时间复杂度:O(n) 相当于每个节点都被遍历了一遍
空间复杂度:栈的开销,平均O(logn),最坏树是一个链表O(n)
迭代遍历:
public List<Integer> preorderTraversal(TreeNode root) {if (root == null) {return new ArrayList<>();}Stack<TreeNode> stack = new Stack<>();stack.add(root);List<Integer> res = new ArrayList<>();while (!stack.isEmpty()) {TreeNode tmp = stack.pop();res.add(tmp.val);if (tmp.right != null) {stack.add(tmp.right);}if (tmp.left != null) {stack.add(tmp.left);}}return res;}
94.二叉树的中序遍历
递归:
class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();reverse(root, res);return res;}private void reverse(TreeNode root, List<Integer> res) {if (root == null) {return;}reverse(root.left, res);res.add(root.val);reverse(root.right, res);}
}
迭代遍历: 第一遍没写出来,二刷时候再写一遍
class Solution {public List<Integer> inorderTraversal(TreeNode root) {if (root == null) {return new ArrayList<>();}Stack<TreeNode> stack = new Stack<>();List<Integer> res = new ArrayList<>();TreeNode tmp = root;while (tmp != null || !stack.isEmpty()) {if (tmp != null) {stack.add(tmp);tmp = tmp.left;} else {tmp = stack.pop();res.add(tmp.val);tmp = tmp.right;}}return res;}
}
145.二叉树的后序遍历
递归:
class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();reverse(root, res);return res;}private void reverse(TreeNode root, List<Integer> res) {if (root == null) {return;}reverse(root.left, res);reverse(root.right, res);res.add(root.val);}
}
迭代遍历:
class Solution {public List<Integer> postorderTraversal(TreeNode root) {if (root == null) {return new ArrayList<>();}// 递归前序遍历Stack<TreeNode> stack = new Stack<>();stack.add(root);List<Integer> res = new ArrayList<>();while (!stack.isEmpty()) {TreeNode tmp = stack.pop();res.add(tmp.val);if (tmp.left != null) {stack.add(tmp.left);}if (tmp.right != null) {stack.add(tmp.right);}}Collections.reverse(res);return res;}
}
统一的迭代遍历模板:
前序:
class Solution {public List<Integer> preorderTraversal(TreeNode root) {if (root == null) {return new ArrayList<>();}List<Integer> res = new ArrayList<>();Stack<TreeNode> stack = new Stack<>();stack.add(root);while (!stack.isEmpty()) {TreeNode tmp = stack.peek();if (tmp != null) {stack.pop();if (tmp.right != null) {stack.add(tmp.right);}if (tmp.left != null) {stack.add(tmp.left);}stack.add(tmp);stack.add(null);} else {stack.pop();res.add(stack.pop().val);}}return res;}
}
前序遍历是按照中左右的顺序遍历的,所以放入栈中的顺序应该是右左中(中序是左中右,放入顺序是右中左,后序是左右中,放入顺序是中右左),节点上再插入一个空节点表示要弹出放在结果集中的,挺不好想的。
102.二叉树的层序遍历
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)
public List<List<Integer>> levelOrder(TreeNode root) {if (root == null) {return new ArrayList<>();}Queue<TreeNode> queue = new ArrayDeque<>();queue.add(root);List<List<Integer>> res = new ArrayList<>();while (!queue.isEmpty()) {int num = queue.size();List<Integer> list = new ArrayList<>();while (num-- > 0) {TreeNode tmp = queue.poll();list.add(tmp.val);if (tmp.left != null) {queue.add(tmp.left);}if (tmp.right != null) {queue.add(tmp.right);}}res.add(list);}return res;}
时间复杂度、空间复杂度均为O(n)
算法刷刷刷|二叉树篇|二叉树的遍历相关推荐
- 【算法刷题2】二叉树的后序遍历
什么是二叉树的后续遍历,简单来说就是"左右根",展开来说就是优先访问根节点的左子树的全部节点,然后再访问根节点的右子树的全部节点,最后再访问根节点.对于每棵子树的访问也按照这个逻辑 ...
- 【算法刷题1】二叉树的前序遍历
解题思路 什么是二叉树的前序遍历?简单来说就是"根左右",展开来说就是对于一颗二叉树优先访问其根节点,然后访问它的左子树,等左子树全部访问完了再访问其右子树,而对于子树也按照之前的 ...
- 【算法刷题3】二叉树的最大深度
最大深度是所有叶子节点的深度的最大值,深度是指树的根节点到任一叶子节点路径上节点的数量,因此从根节点每次往下一层深度就会加1.因此二叉树的深度就等于根结点这个1层加上左子树和右子树深度的最大值.而每个 ...
- java删除有序数组中的重复元素_算法刷刷刷Leetcode第26题删除排序数组中的重复项...
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度.不要使用额外的数组空间,你必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成.示例 ...
- 刷题:二叉树的非递归遍历方式
二叉树的非递归的遍历方式 上篇博客记录了二叉树的递归遍历方式以及根据二叉树的遍历结果还原二叉树的内容. 本篇博客记录二叉树的非递归的遍历方式. 二叉树的非递归遍历需要借助栈来实现,而且三种遍历的方式的 ...
- LeetCode刷题实战314:二叉树的竖直遍历
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...
- js遍历树节点下的所有子节点_【数据结构与算法】(3)——树和二叉树
树 树的基本概念 树是一种非线性的数据结构,样子如图所示: 树的主要特点是树中的数据是分层存储的,每个元素称为树的节点,最顶层有且只有一个元素,称为根节点,其余层可以有任意数量的节点.除了根节点,其余 ...
- 数据结构与算法之二叉树的先序遍历,中序遍历,后序遍历
数据结构与算法之二叉树的先序遍历,中序遍历,后移遍历 目录 实现二叉树的先序,中序,后序遍历,包括递归方式和非递归方式 在二叉树中找到一个节点的后继节点 1. 实现二叉树的先序,中序,后序遍历,包括递 ...
- 二叉树的建立和遍历算法 - 数据结构和算法47
二叉树的建立和遍历算法 让编程改变世界 Change the world by program 有童鞋会说,我们上节课研究这么多遍历的方法干啥呢?聪明的鱼油们怎么看?! 对于二叉树,思路方面我们已 ...
最新文章
- 自己编写linux系统,自己动手 编写Linux系统的设备驱动程序
- java循环使用范围_Java循环流程控制语句
- PC问题-VMware Workstation出现“文件锁定失败”
- c语言pop逆置单链表,C语言实现单链表
- Redis布隆过滤器
- (3) ebj学习:有状态bean和无状态bean区别
- SpringMVC系列一
- mysql加锁6_MySQL优化(6):Mysql锁机制
- linux软件管理(yum,rpm)
- 何必!放着985双一流专业不读,非要当程序员去内卷!
- 全网最全的 JavaScript 数组各个方法用途的思维导图
- qrcode生成带logo的二维码(插件,示例代码)
- 微星小飞机界面翻译_6 款实用小程序良心推荐,每一款都好用
- 【Pyecharts | Scatter】气泡图实现 / 1990 与 2015 年各国家人均寿命与GDP
- 经济学计算机会成本和贸易区直的题,管理经济学2017年4月真题(02628)
- 再见2021,你好2022
- 便携式禁毒采样器的基础功能
- 旅行售货员问题及其近似算法(NPC问题)
- JAVA版本号的问题 Java版本号与JDK版本
- CGO arm 树莓pi下的交叉编译