Algorithms_二叉树的前序遍历、中序遍历、后续遍历(深度优先)
文章目录
- 前序、中序、后序的含义
- 实例
- 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_二叉树的前序遍历、中序遍历、后续遍历(深度优先)相关推荐
- java 二叉树的实现以及前序、中序、后续遍历实现
目录 前言 完全二叉树 完全二叉树实现代码 测试 输出 前言 二叉树是n个有限元素的集合,该集合或者为空.或者由一个称为根(root)的元素及两个不相交的.被分别称为左子树和右子树的二叉树组成,是有序 ...
- java键盘输入构建任意二叉树并实现前序、中序、后续遍历
import java.util.ArrayList; import java.util.List; import java.util.Scanner;public class CreateBinar ...
- 二叉树的前序、中序、后续、层序遍历(包含递归与非递归)
递归形式 递归形式遍历比较简单,不做详细论述. 前序遍历 void Preorder(treenode* root) //前序 {if (root != NULL){printf("%c&q ...
- 二叉树的前序、中序、后序遍历非递归实现
这是leetcode上的3个题目,要求用非递归实现,其中以后序遍历实现最难,既然递归实现的三种遍历程序只需要改变输入代码顺序,为什么循环不可以呢,带着这种执拗的想法,我开始了这次研究 我依然是将递归用 ...
- 二叉树的前序、中序、后序遍历与创建
#include <iostream> #include <string> #include <stack> using namespace std; struct ...
- LeetCode--144,94,145,102 二叉树的前序、中序、后序、层序遍历(递归,迭代,栈,队列)
二叉树的前序.中序.后序.层序遍历(递归,迭代,栈,队列) 1. 二叉树的前序遍历 1.1 题目描述 1.2 题目分析 1.3 Python实现 2. 二叉树的中序遍历 2.1 题目描述 2.2 题目 ...
- 如何判断二叉树的前序,中序,后序遍历
文章目录 前言 一.如何判断二叉树的前序,中序,后序遍历? 二.已知二叉树的前序遍历和中序遍历,如何得到它的后序遍历? 三.程序实现 总结 前言 最近复习题中看到二叉树,对于它的前序,中序,后序遍历的 ...
- 非递归实现二叉树的前序、中序、后序遍历
目录 非递归实现二叉树的前序遍历 非递归实现二叉树的中序遍历 非递归实现二叉树的后序遍历 根据二叉树的前序和中序遍历结果还原二叉树 根据二叉树的中序和后序遍历结果还原二叉树 非递归遍历需要借助栈. 非 ...
- 二叉树的前序、中序、后序遍历(递归、非递归写法)
文章目录 一.什么是二叉树? 二.二叉树的基本概念 三.二叉树的三种遍历方式 1.前序遍历(preordertraversal) 1.中序遍历(inordertraversal) 1.后序遍历(pos ...
- 二叉树的前序、中序、后序遍历以及根据前序和中序或中序和后序生成二叉树
二叉树的前序.中序.后序遍历:根据前序和中序或中序和后序生成二叉树 给定如下二叉树: 前序遍历结果:1234567 中序遍历结果:3241657 后序遍历结果:3426751 遍历代码实现:思路:将子 ...
最新文章
- 自动驾驶系统关系与自动泊车原理
- 【C++】C++11 STL算法(一):非修改序列操作(Non-modifying sequence operations)
- 总结ISO各层协议都有哪些
- mysql分区字段创建索引_MySQL分区字段列有必要再单独建索引吗?
- 分享一些好用的 Chrome 插件!
- 项目由于装运点不同交货拆分解决方案
- java请求并行方案_让 Yar Java Client 支持执行并行请求,ExecutorService 的使用
- 设计模式12_外观模式
- python之HTTP处理模块urllib和urllib2
- 人人都是产品经理(互联网产品经理的第一本书,马云力荐!)
- Ubuntu 18.04 隐藏桌面的回收站图标
- 机器学习学习笔记之——处理文本数据
- C++ strtok函数详解
- 爆款AR游戏如何打造?网易杨鹏以《悠梦》为例详解前沿技术
- 小白Mac C/C++ for Visual Studio Code配置
- 在虚幻引擎4中播放视频文件超详细教程
- 关于实验室信息管理系统(LIMS)三大问题
- 小白在MAC上装mixly,出现“未能启动java.jar文件Mixly.jar”以及接Arduino UNO后电脑自动重启的问题
- 计算机excel数据模板,excel表格范本
- 未来5年最有“钱景”的行业!两会上指明了~
热门文章
- Android:安卓APP启动过程简介
- java wav 波形_java读取wav文件(波形文件)并绘制波形图的方法
- 监听对象中某一项的值_Vue中watch的详细用法
- java (三)面向对象编程
- Leetcode 100. 相同的树 (每日一题 20210811)
- 628. Maximum Product of Three Numbers
- 数据中台实战(八):如何打造可以支撑N条产品线的标签平台
- hadoop学习-海量日志分析(提取KPI指标)
- Python零碎知识(2):强大的zip
- QT如何实现对于字符串数学公式计算