二叉树的四种遍历(递归非递归)

黑洞算法
• 阅读 1498

这棵树

二叉树的四种遍历(递归非递归)

  • 前序遍历:5 5 3 9 1 7 6 2 4 1
  • 中序遍历:9 3 1 5 5 2 6 4 7 1
  • 后序遍历:9 1 3 5 2 4 6 1 7 5
  • 层次遍历:5 5 7 3 6 1 9 1 2 4

前序遍历

递归实现

  // 前序遍历(递归)
  public static void preOrder(BinaryTree bt) {
    if (null != root) {
      System.out.print(bt.val + " ");
      preOrder(bt.left);
      preOrder(bt.right);
    }
  }

非递归实现

  • 利用栈,每次根节点入栈之后出栈,再依次将右子树节点和左子树节点入栈,直到栈空。
// 前序遍历(非递归:利用栈)
  public static void preOrder1(BinaryTree bt) {
    if (bt != null) {
      Stack<BinaryTree> tmp = new Stack<>();
      tmp.push(bt);
      while (!tmp.isEmpty()) {
        BinaryTree b = tmp.pop();
        System.out.print(b.val + " ");
        // 注意:先将右子树孩子压入栈,再将左子树压入栈
        if (b.right != null) {
          tmp.push(b.right);
        }
        if (b.left != null) {
          tmp.push(b.left);
        }
      }
    }
  }

中序遍历

递归实现

// 中序遍历(递归)
  public static void inOrder(BinaryTree bt) {
    if (bt != null) {
      inOrder(bt.left);
      System.out.print(bt.val + " ");
      inOrder(bt.right);
    }
  }

非递归实现

后序遍历

递归实现

 // 后序遍历(递归)
  public static void postOrder(BinaryTree bt) {
    if (bt != null) {
      postOrder(bt.left);
      postOrder(bt.right);
      System.out.print(bt.val + " ");
    }
  }

非递归实现

层次遍历

  • BFS
  • 用队列实现
  // 层次遍历
  public static void levelOrder(BinaryTree bt) {
    if (bt != null) {
      Queue<BinaryTree> tmp = new LinkedList<>();
      tmp.add(bt);
      while (!tmp.isEmpty()) {
        BinaryTree b = tmp.poll();
        System.out.print(b.val + " ");
        if (b.left != null) {
          tmp.add(b.left);
        }
        if (b.right != null) {
          tmp.add(b.right);
        }
      }
    }
  }
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
九路 九路
4年前
前端学数据结构与算法:二叉树的四种遍历方式及其应用
前言上一章我们从0到1的实现了一颗二叉搜索树,以及理解了二叉搜索树的特性与基本操作,这一章介绍关于二叉树的更多操作,也就是树的遍历,对树的每个节点进行访问。主要包括前序遍历、中序遍历、后序遍历、层序遍历,前面三种也叫深度优先遍历(DFS),最后的层序遍历也叫广度优先遍历(BFS),理解这四种遍历方式的不同,再遇到树相关的算法问题时,也就能更加游刃有余。这
22 22
4年前
二叉树创建后,如何使用递归和栈遍历二叉树?
0.前言前文主要介绍了树的相关概念和原理,本文主要内容为二叉树的创建及遍历的代码实现,其中包括递归遍历和栈遍历。1.二叉树的实现思路1.0.顺序存储——数组实现前面介绍了满二叉树和完全二叉树,我们对其进行了编号——从0到n的不中断顺序编号,而恰好,数组也有一个这样的编号——数组下标,只要我们把二者联合起来,数组就能存储二叉树了。那么非满
Wesley13 Wesley13
3年前
JAVA递归实现线索化二叉树
JAVA递归实现线索化二叉树基础理论首先,二叉树递归遍历分为先序遍历、中序遍历和后序遍历。先序遍历为:根节点左子树右子树中序遍历为:左子树根节点右子树后序遍历为:左子树右子树根节点(只要记住根节点在哪里就是什么遍历,且都是先左再右)线索化现在有这么一棵二叉树,它的数据结
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
Java实现二叉树的前序、中序、后序、层序遍历(非递归方法)
Java实现二叉树的前序、中序、后序、层序遍历(非递归方法)(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.cnblogs.com%2Fliuyang0%2Fp%2F6271331.html)
Wesley13 Wesley13
3年前
04.重建二叉树 (Java)
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。(https://www.oschina.net/action/GoToLink?urlht
Wesley13 Wesley13
3年前
6.重建二叉树(代码未完成)
 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出图2.6所示的二叉树并输出它的头结点。!(https://static.oschina.net/uploads
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
菜园前端 菜园前端
2年前
什么是二叉树?
原文链接:什么是二叉树?树中每个节点最多只能有两个子节点,在JavaScript中一般都是通过Object来模拟二叉树。常用操作前序遍历中序遍历后序遍历前序遍历根左右。口诀:1.访问根节点2.对根节点的左子树进行前序遍历3.对根节点的右子树进行前序遍历通过
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(