LeetCode——树:层次遍历、前中后序遍历
LeetCode——树:层次遍历、前中后序遍历
目录
- 层次遍历
- 二叉树的层平均值
- 找树左下角的值
- 前中后序遍历
- 概述
- 非递归实现二叉树的前序遍历
- 非递归实现二叉树的中序遍历
- 非递归实现二叉树的后序遍历
1. 层次遍历
1. 二叉树的层平均值(LeetCode637)
- 概述
1. 给定一个非空二叉树, 返回一个由每层节点平均值组成的数组.
- 思路
- 利用广度优先搜索遍历整颗二叉树。
- 首先将它的根节点放入队列queue中,如果queue不为null,进入while循环
1. 计算当前queue的size用于待会for循环遍历,创建变量sum记录每层的和
2. queue.size.for循环,创建临时节点node存储queue弹出的元素,sum+=node.val。如果node.left或者right不为null,则加入队列
3. 退出for循环,则得到了每层的值sum,该层节点个数cnt。相除即是结果
- 代码
public static List < Double > averageOfLevels(TreeNode root) {List<Double> ret = new ArrayList<>();if (root==null){return ret;}Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()){int cnt = queue.size();double sum = 0;for (int i = 0; i < cnt; i++) {TreeNode node = queue.poll();sum += node.val;if (node.left !=null)queue.offer(node.left);if (node.right!=null)queue.offer(node.right);}ret.add(sum/cnt);}return ret;}
- 小结
1. 利用队列可以先遍历每一层的节点
2. 找树左下角的值(LeetCode513)
- 概述
1. 给定一个二叉树,在树的最后一行找到最左边的值。
- 思路
- 利用队列进行层次遍历,遍历过程加入队列时,先加右节点,再加左节点,这样队列每层出来的顺序就从右到左的
- 如果遍历加入队列时,是先加左节点,再加右节点,那么队列每层出来的顺序就是从左往右的
- 代码
public static int findBottomLeftValue(TreeNode root) {Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {root = queue.poll();if (root.right != null)queue.offer(root.right);if (root.left != null)queue.offer(root.left);}return root.val;}
3. 前中后序遍历
0. 概述
1. 层次遍历顺序:[1,2,3,4,5,6]
2. 前序遍历顺序:[1,2,4,5,3,6]
3. 中序遍历顺序:[4,2,5,1,3,6]
4. 后序遍历顺序:[4,5,2,6,3,1]
- 层次遍历使用BFS实现,利用的就是BFS一层一层遍历的特性
- 而前序,中序,后序遍历利用了DFS实现。前序,中序,后序只是对节点访问的顺序有一点不同,其他都相同
- 递归版前序,中序,后序代码
public static void preOrderRecur(TreeNode head) {if (head == null) {return;}System.out.print(head.val + " ");preOrderRecur(head.left);preOrderRecur(head.right);}public static void inOrderRecur(TreeNode head) {if (head == null) {return;}inOrderRecur(head.left);System.out.print(head.val + " ");inOrderRecur(head.right);}public static void posOrderRecur(TreeNode head) {if (head == null) {return;}posOrderRecur(head.left);posOrderRecur(head.right);System.out.print(head.val + " ");}
1. 非递归实现二叉树的前序遍历
- 利用栈
- 利用栈先进后出的数据结构,可以对二叉树进行遍历。
- 先把head节点加入stack,当stack不为null时while循环stack,弹出栈顶元素,打印(因为前序遍历的顺序是:根左右,第一次遇到这个节点就打印)。
- 然后如果当前节点右孩子不为null,加入栈,左孩子不为null,加入栈,因为打印顺序是:根左右,所以加入顺序为根右左
- 代码实现
public static void preOrderUnRecur(TreeNode head) {if (head==null){return;}Stack<TreeNode> stack = new Stack<>();stack.push(head);while (!stack.isEmpty()){head = stack.pop();System.out.print(head.val+" ");if (head.right!=null)stack.push(head.right);if (head.left!=null)stack.push(head.left);}}
2. 非递归实现二叉树的中序遍历
- 利用栈
- 当栈不为null或者head!=null时,如果此时head!=null,则将它加入栈中,也就是将左边节点全部压入栈中
- 当head==null时,就会返回栈的最后一个元素,此时是第二次到达这个节点,所以就要打印(中序遍历:左中右,表示第二遇到这个节点就打印),然后跳到右节点
- 代码实现
public static void inOrderUnRecur(TreeNode head) {if (head != null) {Stack<TreeNode> stack = new Stack<>();while (!stack.isEmpty() || head != null) {if (head != null) {stack.push(head);head = head.left;} else {head = stack.pop();System.out.print(head.val + " ");head = head.right;}}}}
3. 非递归实现二叉树的后序遍历
- 利用双栈
- 后序遍历的顺序为:左右中,我们知道前序遍历:中左右,当我们在前序遍历时先添加左节点,再添加右节点时,它的顺序就会变为中右左(栈的特性),这是我们将元素添加到另一个栈,打印出的顺序就为:左右中
- 代码实现
public static void posOrderUnRecur1(TreeNode head) {if (head!=null){Stack<TreeNode> s1 = new Stack<>();Stack<TreeNode> s2 = new Stack<>();s1.push(head);while (!s1.isEmpty()){head = s1.pop();s2.push(head);if (head.left!=null)s1.push(head.left);if (head.right!=null)s1.push(head.right);}while (!s2.isEmpty()){System.out.print(s2.pop().val+" ");}}}
补充:还有一种神奇的二叉树前中后序遍历算法——Morris遍历,有时间补充,之前总结过了,不过我也有点忘了…
二叉树的遍历(递归,非递归,Morris)
LeetCode——树:层次遍历、前中后序遍历相关推荐
- 二叉树前中后序遍历的非递归实现以及层次遍历、zig-zag型遍历详解
前言 二叉树的遍历是一个比较常见的问题,递归实现二叉树的前中后序遍历比较简单,但非递归实现二叉树的前中后序遍历相对有难度.这篇博客将详述如何使用非递归的方式实现二叉树的前中后序遍历,在进行理论描述的同 ...
- 数据结构-二叉树(包含二叉树的层次建树、前中后序遍历、层次遍历解析及代码)
目录 一.树与二叉树的原理解析 1.树的定义 2.树的结构和特点 3.二叉树的定义 4.树结点的数据结构 二.二叉树的层次建树 1.二叉树层次建树的原理及分析 2.完整代码 三.二叉树的前中后序遍历 ...
- 二叉树前中后序遍历+刷题【中】【数据结构/初阶/C语言实现】
文章目录 1. 二叉树基础操作 1.1 二叉树遍历 1.1.1 前序遍历 前序遍历(Pre-Order Traversal) 1.1.2 中序遍历 中序遍历(In-Order Traversal) 1 ...
- 代码随想录——二叉树(一):前中后序遍历,层序遍历,翻转
题目来自:https://www.programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80. ...
- 二叉树N叉数的前中后序遍历总结,python实现递归法和迭代法
关于二叉树的前序遍历(preoder).中序遍历(inorder)和后序遍历(postorder),实际上只需要记住:左子节点一定在右子节点的左边(左右),所谓前中后序遍历就是根节点的位置不同,前序是 ...
- [Leedcode][JAVA][第94/144/145题][前中后序遍历][递归][迭代][二叉树]
[问题描述][] 前序遍历 先输出当前结点的数据,再依次遍历输出左结点和右结点 中序遍历 先遍历输出左结点,再输出当前结点的数据,再遍历输出右结点 后续遍历 先遍历输出左结点,再遍历输出右结点,最后输 ...
- 二叉树的层序遍历和前中后序遍历代码 迭代/递归
二叉树的层序遍历和前中后序遍历代码 迭代/递归 只记录代码.思路参考代码随想录:https://github.com/youngyangyang04/leetcode-master/blob/mast ...
- 二叉树非递归dfs——简单思路搞定前中后序遍历
前言:相信很多同学都被二叉树非递归dfs的前中后序遍历方法弄的头疼.网上的答案,什么前中后序遍历各有一套写法,还有什么一个栈的写法,两个栈的写法.看起来能理解,一闭眼自己写都记不住.今天介绍一种用一种 ...
- python实现二叉树非递归前中后序遍历
python实现二叉树非递归前中后层序遍历 二叉树是数据结构中重要的一部分,本文简单介绍用python实现二叉树的前中后序遍历,包括递归和非递归思路算法. # -*- 二叉树 begin -*- # ...
最新文章
- 用行为级描述方式实现一个加法器电路(基于ISE的设计)(2输入1位全加器电路)
- 《Windows核心编程》---剪贴板
- 一款粉笔最近火了 世界各国数学家为什么集体囤粉笔
- Elasticsearch Java Low Level REST Client(通用配置)
- linux登录界面说明,Linux登录界面以及简单使用入门
- 为什么使用 SLF4J 而不是 Log4J 来做 Java 日志
- java毕业设计HTML5旅游网站源码+系统+数据库+lw文档+调试运行
- 昂达v891w可以用u盘linux,昂达V891W CH Windows10(TH2)系统镜像(适用于V1版本)下载...
- 一、最简单的爬虫(python3 爬虫小白系列文章)
- 计算机io设备是cpu控制的吗,I/O控制器及控制方式,了解一下
- GitHub怎么搜索项目
- javafx-更改程序图标
- java熟人_英语中对各种不同程度关系的朋友是怎么表示的(就像汉语里有泛泛之交、熟人、朋友、死党之类的)?...
- 重置计算机网络设置路由器,路由器怎样重新设置_路由器重新设置怎么弄-系统城...
- 教你制作第一个C++游戏!#1 引入
- md5update java_JAVA实现MD5算法
- 路由器接口配置与管理——6
- 再读杨绛_RWERWERWE_96921_新浪博客
- python+openCV 自适应阈值分割
- 短视频平台搭建图片压缩
热门文章
- PHP实习之路—NO.2(看IPB博文的源码,理清别人开发的思路)
- ICC_lab总结——ICC_lab6:版图完成
- 使用CoreText实现图文混排
- Android ViewPager
- 分布式监控之Zabbix-Server
- 要找工作了,拿什么拯救你——我的能力
- linux svn 重新定位SVN URL
- 2021-2022年度第三届全国大学生算法设计与编程挑战赛(秋季赛)- 占座位(最小割)
- 2020ICPC(南京) - Just Another Game of Stones(吉司机线段树+博弈)
- HDU - 5573 Binary Tree(思维+构造+二进制)