zoukankan      html  css  js  c++  java
  • 二叉树的前序,中序,后序遍历——递归和非递归实现

    前序遍历:按照“根-左-右”的顺序遍历。

    中序遍历:按照“左-根-右”的顺序遍历。

    后序遍历:按照“左-右-根”的顺序遍历。

    递归版:

    递归版的代码非常简单,我给大家分析一下原理。

    ①我们先忽略中间的打印语句,单独分析这个函数

    ②遍历顺序是不是这样的。

    1->2->4->null->4->null->4->2->5->null->5->null->5->2->1->3->6->null->6->null->6->7->null->7->null->7->3->1

    ③我们把null去掉。

    1->2->4->4->4->2->5->5->5->2->1->3->6->6->6->3->7->7->7->3->1

    ④里面的每一个数都出现了3次。

    ⑤若我们将这些数第一次出现就打印。就是先序遍历。

    1->2->4->5->3->6->7

    ⑥若我们将这些数第二次出现就打印。就是中序遍历

    4->2->5->1->6->3->7

    ⑦若我们将这些数第三次出现就打印。就是后序遍历

    4->5->2->6->7->3->1

    中序遍历代码:

    后序遍历代码:

    非递归版:

    先序遍历。①先准备一个栈②先将根节点压入栈③弹出一个节点。打印节点。④若右孩子不为null,就将右孩子压栈。⑤若左孩子不为null,就将左孩子压栈。⑥重复3,4,5步直到栈为空。代码实现

    中序遍历①先准备一个栈②若当前节点不为空,将当前节点压栈,然后来到左孩子③若当前节点为空,弹出一个节点并打印。然后来到右孩子。④当前节点非空或栈不为空执行2,3。代码实现

    后序遍历后序遍历如果只用一个栈来实现有点麻烦。递归版可以做到将一个节点压入栈中3次。自己压栈则有些麻烦。我们采用使用两个栈的方式来实现后序遍历。在实现前序遍历的非递归实现时,①压根节点,②压右节点,③压左节点(根->左->右)这样我们可以①压根节点,②压左节点,③压右节点将它放入一个栈中(根->右->左)然后将上面的栈倒进另一个栈中。就变成了(左->右->根)。为后序遍历顺序。2.代码实现:

    全部代码:

    运行结果:

    转载自https://baijiahao.baidu.com/s?id=1652242076931729515&wfr=spider&for=pc
  • 相关阅读:
    网络流(平面图转对偶图)
    666
    期望总结
    docker-1-简介
    22、整合mybatis
    21、整合Druid数据源
    20、Springboot 与数据访问(JDBC/自动配置)
    19、配置嵌入式servlet容器(下)
    18、配置嵌入式servlet容器(2)
    17、配置嵌入式servlet容器(1)
  • 原文地址:https://www.cnblogs.com/zwb-19981125/p/13158855.html
Copyright © 2011-2022 走看看