文章目录

  • 前序、中序、后序的含义
  • 实例
  • Code (递归)
    • 前序遍历
    • 中序遍历
    • 后序遍历
    • 测试
  • Code (非递归)


前序、中序、后序的含义

前序遍历: 先输出父节点,再遍历左子树,最后遍历右子树

中序遍历 : 先遍历左子树,再输出父节点,最后遍历右子树

后序遍历 : 先遍历左子树,再遍历右子树,最后输出父节点

如何区分呢?

输出父节点的顺序 ,就可以确定是 前序、中序、后序


实例

我们先来分析下 将 下面的几个数 放到 二分搜索树中会是怎样的存放 。

注意我们这里用的是二分搜索树来演示二叉树的这个遍历,才会有中序遍历的那个排序的特征。

5     /   \   3     6   / \      \ 2   4      8

前序遍历: 5 、3、2、4、6、8

中序遍历: 2、3、4、5、6、8

后序遍历 : 2、4、3、8、6、5

其实 , 前序遍历比较常用。

观察中序遍历,可以看到是排序的 ,这个也很好理解。 毕竟是 左侧的都是小于父节点的,右侧都是大于父节点的。

后序遍历的适用场景,举个例子 为二分搜索树释放内存

前序遍历、中序遍历、后续遍历本质上一种深度遍历


Code (递归)

前序遍历

 /*** * * @Title: preOrder* * @Description: 二分搜索树的前序遍历* * * @return: void*/public void preOrder() {preOrder(root);}/*** * * @Title: preOrder* * @Description: 前序遍历以node为根的二分搜索树, 递归算法* * @param node* * @return: void*/private void preOrder(Node node) {if (node == null) // 终止条件return;System.out.print(node.e + "--"); // 先输出父节点preOrder(node.left); // 再遍历左子树preOrder(node.right); // 最后遍历又子树}

中序遍历

/*** * * @Title: inOrder* * @Description: 二分搜索树的中序遍历* * * @return: void*/public void inOrder() {inOrder(root);}/*** * * @Title: inOrder* * @Description: 中序遍历以node为根的二分搜索树, 递归算法* * @param node* * @return: void*/private void inOrder(Node node) {if (node == null) // 终止条件return;inOrder(node.left);System.out.println(node.e);inOrder(node.right);}

后序遍历

/*** * * @Title: postOrder* * @Description: 二分搜索树的后序遍历* * * @return: void*/public void postOrder() {postOrder(root);}/*** * * @Title: postOrder* * @Description: 后序遍历以node为根的二分搜索树, 递归算法* * @param node* * @return: void*/private void postOrder(Node node) {if (node == null) // 终止条件return; postOrder(node.left);postOrder(node.right);System.out.println(node.e);}

测试

public static void main(String[] args) {BinarySearchTree<Integer> bst = new BinarySearchTree<>();int[] nums = { 5, 3, 6, 8, 4, 2 };for (int num : nums) {bst.add(num);}bst.preOrder();System.out.println("============================");bst.inOrder();System.out.println("============================");bst.postOrder();}

Code (非递归)

不用递归也可以实现,我们要借助Stack来实现这个。 推荐使用递归的方式,代码更简洁。

这里把不用递归的代码也贴一下,供参考

/*** * * @Title: preOrderNR* * @Description: 二分搜索树的前序遍历 非递归的方式 栈是LIFO ,前序遍历(先处理左子树,后处理右子树)*               ,需要先把右节点入栈,这样才能确保后处理* * @return: void*/public void preOrderNR() {Stack<Node> stack = new Stack<>();stack.push(root); // 把root入栈while (!stack.isEmpty()) {Node currentNode = stack.pop();System.out.println(currentNode.e);if (currentNode.right != null) {stack.push(currentNode.right);}if (currentNode.left != null) {stack.push(currentNode.left);}}}

Algorithms_二叉树的前序遍历、中序遍历、后续遍历(深度优先)相关推荐

  1. java 二叉树的实现以及前序、中序、后续遍历实现

    目录 前言 完全二叉树 完全二叉树实现代码 测试 输出 前言 二叉树是n个有限元素的集合,该集合或者为空.或者由一个称为根(root)的元素及两个不相交的.被分别称为左子树和右子树的二叉树组成,是有序 ...

  2. java键盘输入构建任意二叉树并实现前序、中序、后续遍历

    import java.util.ArrayList; import java.util.List; import java.util.Scanner;public class CreateBinar ...

  3. 二叉树的前序、中序、后续、层序遍历(包含递归与非递归)

    递归形式 递归形式遍历比较简单,不做详细论述. 前序遍历 void Preorder(treenode* root) //前序 {if (root != NULL){printf("%c&q ...

  4. 二叉树的前序、中序、后序遍历非递归实现

    这是leetcode上的3个题目,要求用非递归实现,其中以后序遍历实现最难,既然递归实现的三种遍历程序只需要改变输入代码顺序,为什么循环不可以呢,带着这种执拗的想法,我开始了这次研究 我依然是将递归用 ...

  5. 二叉树的前序、中序、后序遍历与创建

    #include <iostream> #include <string> #include <stack> using namespace std; struct ...

  6. LeetCode--144,94,145,102 二叉树的前序、中序、后序、层序遍历(递归,迭代,栈,队列)

    二叉树的前序.中序.后序.层序遍历(递归,迭代,栈,队列) 1. 二叉树的前序遍历 1.1 题目描述 1.2 题目分析 1.3 Python实现 2. 二叉树的中序遍历 2.1 题目描述 2.2 题目 ...

  7. 如何判断二叉树的前序,中序,后序遍历

    文章目录 前言 一.如何判断二叉树的前序,中序,后序遍历? 二.已知二叉树的前序遍历和中序遍历,如何得到它的后序遍历? 三.程序实现 总结 前言 最近复习题中看到二叉树,对于它的前序,中序,后序遍历的 ...

  8. 非递归实现二叉树的前序、中序、后序遍历

    目录 非递归实现二叉树的前序遍历 非递归实现二叉树的中序遍历 非递归实现二叉树的后序遍历 根据二叉树的前序和中序遍历结果还原二叉树 根据二叉树的中序和后序遍历结果还原二叉树 非递归遍历需要借助栈. 非 ...

  9. 二叉树的前序、中序、后序遍历(递归、非递归写法)

    文章目录 一.什么是二叉树? 二.二叉树的基本概念 三.二叉树的三种遍历方式 1.前序遍历(preordertraversal) 1.中序遍历(inordertraversal) 1.后序遍历(pos ...

  10. 二叉树的前序、中序、后序遍历以及根据前序和中序或中序和后序生成二叉树

    二叉树的前序.中序.后序遍历:根据前序和中序或中序和后序生成二叉树 给定如下二叉树: 前序遍历结果:1234567 中序遍历结果:3241657 后序遍历结果:3426751 遍历代码实现:思路:将子 ...

最新文章

  1. 自动驾驶系统关系与自动泊车原理
  2. 【C++】C++11 STL算法(一):非修改序列操作(Non-modifying sequence operations)
  3. 总结ISO各层协议都有哪些
  4. mysql分区字段创建索引_MySQL分区字段列有必要再单独建索引吗?
  5. 分享一些好用的 Chrome 插件!
  6. 项目由于装运点不同交货拆分解决方案
  7. java请求并行方案_让 Yar Java Client 支持执行并行请求,ExecutorService 的使用
  8. 设计模式12_外观模式
  9. python之HTTP处理模块urllib和urllib2
  10. 人人都是产品经理(互联网产品经理的第一本书,马云力荐!)
  11. Ubuntu 18.04 隐藏桌面的回收站图标
  12. 机器学习学习笔记之——处理文本数据
  13. C++ strtok函数详解
  14. 爆款AR游戏如何打造?网易杨鹏以《悠梦》为例详解前沿技术
  15. 小白Mac C/C++ for Visual Studio Code配置
  16. 在虚幻引擎4中播放视频文件超详细教程
  17. 关于实验室信息管理系统(LIMS)三大问题
  18. 小白在MAC上装mixly,出现“未能启动java.jar文件Mixly.jar”以及接Arduino UNO后电脑自动重启的问题
  19. 计算机excel数据模板,excel表格范本
  20. 未来5年最有“钱景”的行业!两会上指明了~

热门文章

  1. Android:安卓APP启动过程简介
  2. java wav 波形_java读取wav文件(波形文件)并绘制波形图的方法
  3. 监听对象中某一项的值_Vue中watch的详细用法
  4. java (三)面向对象编程
  5. Leetcode 100. 相同的树 (每日一题 20210811)
  6. 628. Maximum Product of Three Numbers
  7. 数据中台实战(八):如何打造可以支撑N条产品线的标签平台
  8. hadoop学习-海量日志分析(提取KPI指标)
  9. Python零碎知识(2):强大的zip
  10. QT如何实现对于字符串数学公式计算