LeetCode——树:层次遍历、前中后序遍历


目录

  1. 层次遍历

    1. 二叉树的层平均值
    2. 找树左下角的值
  2. 前中后序遍历
    1. 概述
    2. 非递归实现二叉树的前序遍历
    3. 非递归实现二叉树的中序遍历
    4. 非递归实现二叉树的后序遍历

1. 层次遍历

1. 二叉树的层平均值(LeetCode637)

  1. 概述
    1. 给定一个非空二叉树, 返回一个由每层节点平均值组成的数组.
  2. 思路
    1. 利用广度优先搜索遍历整颗二叉树。
    2. 首先将它的根节点放入队列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。相除即是结果
  3. 代码
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. 小结
    1. 利用队列可以先遍历每一层的节点

2. 找树左下角的值(LeetCode513)

  1. 概述
    1. 给定一个二叉树,在树的最后一行找到最左边的值。
  2. 思路
    1. 利用队列进行层次遍历,遍历过程加入队列时,先加右节点,再加左节点,这样队列每层出来的顺序就从右到左的
    2. 如果遍历加入队列时,是先加左节点,再加右节点,那么队列每层出来的顺序就是从左往右的
  3. 代码
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]

  1. 层次遍历使用BFS实现,利用的就是BFS一层一层遍历的特性
  2. 而前序,中序,后序遍历利用了DFS实现。前序,中序,后序只是对节点访问的顺序有一点不同,其他都相同
  3. 递归版前序,中序,后序代码
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. 非递归实现二叉树的前序遍历

  1. 利用栈

    1. 利用栈先进后出的数据结构,可以对二叉树进行遍历。
    2. 先把head节点加入stack,当stack不为null时while循环stack,弹出栈顶元素,打印(因为前序遍历的顺序是:根左右,第一次遇到这个节点就打印)。
    3. 然后如果当前节点右孩子不为null,加入栈,左孩子不为null,加入栈,因为打印顺序是:根左右,所以加入顺序为根右左
    4. 代码实现
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. 非递归实现二叉树的中序遍历

  1. 利用栈

    1. 当栈不为null或者head!=null时,如果此时head!=null,则将它加入栈中,也就是将左边节点全部压入栈中
    2. 当head==null时,就会返回栈的最后一个元素,此时是第二次到达这个节点,所以就要打印(中序遍历:左中右,表示第二遇到这个节点就打印),然后跳到右节点
    3. 代码实现
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. 非递归实现二叉树的后序遍历

  1. 利用双栈

    1. 后序遍历的顺序为:左右中,我们知道前序遍历:中左右,当我们在前序遍历时先添加左节点,再添加右节点时,它的顺序就会变为中右左(栈的特性),这是我们将元素添加到另一个栈,打印出的顺序就为:左右中
    2. 代码实现
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——树:层次遍历、前中后序遍历相关推荐

  1. 二叉树前中后序遍历的非递归实现以及层次遍历、zig-zag型遍历详解

    前言 二叉树的遍历是一个比较常见的问题,递归实现二叉树的前中后序遍历比较简单,但非递归实现二叉树的前中后序遍历相对有难度.这篇博客将详述如何使用非递归的方式实现二叉树的前中后序遍历,在进行理论描述的同 ...

  2. 数据结构-二叉树(包含二叉树的层次建树、前中后序遍历、层次遍历解析及代码)

    目录 一.树与二叉树的原理解析 1.树的定义 2.树的结构和特点 3.二叉树的定义 4.树结点的数据结构 二.二叉树的层次建树 1.二叉树层次建树的原理及分析 2.完整代码 三.二叉树的前中后序遍历 ...

  3. 二叉树前中后序遍历+刷题【中】【数据结构/初阶/C语言实现】

    文章目录 1. 二叉树基础操作 1.1 二叉树遍历 1.1.1 前序遍历 前序遍历(Pre-Order Traversal) 1.1.2 中序遍历 中序遍历(In-Order Traversal) 1 ...

  4. 代码随想录——二叉树(一):前中后序遍历,层序遍历,翻转

    题目来自: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. ...

  5. 二叉树N叉数的前中后序遍历总结,python实现递归法和迭代法

    关于二叉树的前序遍历(preoder).中序遍历(inorder)和后序遍历(postorder),实际上只需要记住:左子节点一定在右子节点的左边(左右),所谓前中后序遍历就是根节点的位置不同,前序是 ...

  6. [Leedcode][JAVA][第94/144/145题][前中后序遍历][递归][迭代][二叉树]

    [问题描述][] 前序遍历 先输出当前结点的数据,再依次遍历输出左结点和右结点 中序遍历 先遍历输出左结点,再输出当前结点的数据,再遍历输出右结点 后续遍历 先遍历输出左结点,再遍历输出右结点,最后输 ...

  7. 二叉树的层序遍历和前中后序遍历代码 迭代/递归

    二叉树的层序遍历和前中后序遍历代码 迭代/递归 只记录代码.思路参考代码随想录:https://github.com/youngyangyang04/leetcode-master/blob/mast ...

  8. 二叉树非递归dfs——简单思路搞定前中后序遍历

    前言:相信很多同学都被二叉树非递归dfs的前中后序遍历方法弄的头疼.网上的答案,什么前中后序遍历各有一套写法,还有什么一个栈的写法,两个栈的写法.看起来能理解,一闭眼自己写都记不住.今天介绍一种用一种 ...

  9. python实现二叉树非递归前中后序遍历

    python实现二叉树非递归前中后层序遍历 二叉树是数据结构中重要的一部分,本文简单介绍用python实现二叉树的前中后序遍历,包括递归和非递归思路算法. # -*- 二叉树 begin -*- # ...

最新文章

  1. 用行为级描述方式实现一个加法器电路(基于ISE的设计)(2输入1位全加器电路)
  2. 《Windows核心编程》---剪贴板
  3. 一款粉笔最近火了 世界各国数学家为什么集体囤粉笔
  4. Elasticsearch Java Low Level REST Client(通用配置)
  5. linux登录界面说明,Linux登录界面以及简单使用入门
  6. 为什么使用 SLF4J 而不是 Log4J 来做 Java 日志
  7. java毕业设计HTML5旅游网站源码+系统+数据库+lw文档+调试运行
  8. 昂达v891w可以用u盘linux,昂达V891W CH Windows10(TH2)系统镜像(适用于V1版本)下载...
  9. 一、最简单的爬虫(python3 爬虫小白系列文章)
  10. 计算机io设备是cpu控制的吗,I/O控制器及控制方式,了解一下
  11. GitHub怎么搜索项目
  12. javafx-更改程序图标
  13. java熟人_英语中对各种不同程度关系的朋友是怎么表示的(就像汉语里有泛泛之交、熟人、朋友、死党之类的)?...
  14. 重置计算机网络设置路由器,路由器怎样重新设置_路由器重新设置怎么弄-系统城...
  15. 教你制作第一个C++游戏!#1 引入
  16. md5update java_JAVA实现MD5算法
  17. 路由器接口配置与管理——6
  18. 再读杨绛_RWERWERWE_96921_新浪博客
  19. python+openCV 自适应阈值分割
  20. 短视频平台搭建图片压缩

热门文章

  1. PHP实习之路—NO.2(看IPB博文的源码,理清别人开发的思路)
  2. ICC_lab总结——ICC_lab6:版图完成
  3. 使用CoreText实现图文混排
  4. Android ViewPager
  5. 分布式监控之Zabbix-Server
  6. 要找工作了,拿什么拯救你——我的能力
  7. linux svn 重新定位SVN URL
  8. 2021-2022年度第三届全国大学生算法设计与编程挑战赛(秋季赛)- 占座位(最小割)
  9. 2020ICPC(南京) - Just Another Game of Stones(吉司机线段树+博弈)
  10. HDU - 5573 Binary Tree(思维+构造+二进制)