二十五、二叉树的前序、中序、后序遍历
一、为何使用树这种数据结构
- 数组存储方式的分析 优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。 缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低 [示意图]
- 链式存储方式的分析 优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可, 删除效率也很好)。 缺点:在进行检索时,效率仍然较低,比如(检索某个值,需要从头节点开始遍历)
- 树存储方式的分析 能提高数据存储,读取的效率, 比如利用 二叉排序树(Binary Sort Tree),既可以保证数据的检索速度,同时也 可以保证数据的插入,删除,修改的速度。
二、二叉树的概念
树有很多种,每个节点最多只能有两个子节点的一种形式称为二叉树。
二叉树的子节点分为左节点和右节点
示意图
- 如果该二叉树的所有叶子节点都在最后一层,并且结点总数= 2^n -1 , n 为层数,则我们称为满二叉树。
- 如果该二叉树的所有叶子节点都在最后一层或者倒数第二层,而且最后一层的叶子节点在左边连续,倒数第二 层的叶子节点在右边连续,我们称为完全二叉树
三、二叉树的遍历(先序&中序&后序)
前序遍历: 先输出父节点,再遍历左子树和右子树
中序遍历: 先遍历左子树,再输出父节点,再遍历右子树
后序遍历: 先遍历左子树,再遍历右子树,最后输出父节点
四、代码实现
package cn.zzw.algorithm.Tree;public class BinaryTreeDemo {public static void main(String[] args) {//想创建一棵二叉树BinaryTree binaryTree=new BinaryTree();//创建需要的结点HeroNode root=new HeroNode(1,"宋江");HeroNode node2=new HeroNode(2,"吴用");HeroNode node3=new HeroNode(3,"卢俊义");HeroNode node4=new HeroNode(4,"林冲");HeroNode node5=new HeroNode(5,"关胜");//手动创建二叉树root.setLeft(node2);root.setRight(node3);node3.setRight(node4);node3.setLeft(node5);binaryTree.setRoot(root);//测试前序遍历System.out.println("前序遍历");binaryTree.preOrder();//测试中序遍历System.out.println("中序遍历");binaryTree.infixOrder();//测试后序遍历System.out.println("后序遍历");binaryTree.postOrder();}
}//创建二叉树
class BinaryTree
{private HeroNode root;public void setRoot(HeroNode root){this.root=root;}//前序遍历public void preOrder(){if (this.root!=null){this.root.preOrder();}else{System.out.println("二叉树为空,不能遍历");}}//中序遍历public void infixOrder(){if(this.root!=null){this.root.infixOrder();}else{System.out.println("二叉树为空,不能遍历");}}//后序遍历public void postOrder(){if(this.root!=null){this.root.postOrder();}else{System.out.println("二叉树为空,不能遍历");}}
}//创建HeroNode结点,模拟树的结点
class HeroNode
{private int no;private String name;private HeroNode left;//默认nullprivate HeroNode right;//默认nullpublic HeroNode(int no, String name) {this.no = no;this.name = name;}public int getNo() {return no;}public void setNo(int no) {this.no = no;}public String getName() {return name;}public void setName(String name) {this.name = name;}public HeroNode getLeft() {return left;}public void setLeft(HeroNode left) {this.left = left;}public HeroNode getRight() {return right;}public void setRight(HeroNode right) {this.right = right;}@Overridepublic String toString() {return "HeroNode{" +"no=" + no +", name='" + name + '\'' +'}';}//编写前序遍历的方法public void preOrder(){//先输出父节点System.out.println(this);if(this.left!=null){//如果左子树不为空,就递归向左子树进行先序遍历this.left.preOrder();}if(this.right!=null){//如果右子树不为空,就递归向右子树进行先序遍历this.right.preOrder();}}//中序遍历public void infixOrder(){//递归向左子树进行中序遍历if(this.left!=null){this.left.infixOrder();}//输出父节点System.out.println(this);//递归向右子树进行中序遍历if(this.right!=null){this.right.infixOrder();}}//后序遍历public void postOrder(){if(this.left!=null){this.left.postOrder();}if (this.right!=null){this.right.postOrder();}System.out.println(this);}
}
"C:\Program Files\Java\jdk1.8.0_181\bin\java.exe" "-javaagent:D:\IntelliJ IDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=48104:D:\IntelliJ IDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_181\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\rt.jar;C:\Users\1\IdeaProjects\algorithm\out\production\algorithm" cn.zzw.algorithm.Tree.BinaryTreeDemo
前序遍历
HeroNode{no=1, name='宋江'}
HeroNode{no=2, name='吴用'}
HeroNode{no=3, name='卢俊义'}
HeroNode{no=5, name='关胜'}
HeroNode{no=4, name='林冲'}
中序遍历
HeroNode{no=2, name='吴用'}
HeroNode{no=1, name='宋江'}
HeroNode{no=5, name='关胜'}
HeroNode{no=3, name='卢俊义'}
HeroNode{no=4, name='林冲'}
后序遍历
HeroNode{no=2, name='吴用'}
HeroNode{no=5, name='关胜'}
HeroNode{no=4, name='林冲'}
HeroNode{no=3, name='卢俊义'}
HeroNode{no=1, name='宋江'}Process finished with exit code 0
二十五、二叉树的前序、中序、后序遍历相关推荐
- java中二叉树_Java工程师面试1000题224-递归非递归实现二叉树前、中、后序遍历...
224.使用递归和非递归实现二叉树的前.中.后序遍历 使用递归来实现二叉树的前.中.后序遍历比较简单,直接给出代码,我们重点讨论非递归的实现. class Node { public int valu ...
- C++实现二叉树 前、中、后序遍历(递归与非递归)非递归实现过程最简洁版本
本文并非我所写,是复制的该链接中的内容: 最近学习二叉树,想编程实现递归和非递归的实现方式: 递归的方式就不说了,因为大家的递归程序都一样:但是对于非递归的实现方式, 根据这几天的查阅资料已看到差不多 ...
- 二十五、深入Java中的static静态修饰符
@Author:Runsen @Date:2020/6/2 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排名 ...
- 【LeetCode | 二叉树前、中、后序遍历{迭代法}实现】
1.前序遍历 // 解题思路:利用栈的原理实现以迭代方法来前序遍历(根左右)二叉树 class Solution { public:vector<int> preorderTraversa ...
- java数据结构学习笔记-二叉树前、中、后序遍历
public class BinaryTreeDemo {public static void main(String args[]){Employee emp1= new Employee(1,&q ...
- 【LeetCode | 二叉树前、中、后序遍历{递归法}实现】
1.前序遍历 #include <iostream> #include <vector> #include <queue> #include <algorit ...
- 二叉树前、中、后序线索化及遍历
public class ThreadedBinaryTree {public static void main(String[] args){Heronodes node1=new Heronode ...
- 路漫漫其修远兮:js的成长经历(二十五)—— Node.js中的MongoDB
目录 MongoDB简介 MongoDB安装教程 mongoDB基本组成 mongoDB的基本指令 安装可视化操作软件 熟悉使用MongoDB的基本指令(增删改查等) Node进阶-Mongoose ...
- 二十五、深入Python中的协程
@Author: Runsen 一说并发,你肯定想到了多线程+进程模型,确实,多线程+进程,正是解决并发问题的经典模型之一.但对于多核CPU,利用多进程+协程的方式,能充分利用CPU,获得极高的性能. ...
- AUTOSAR从入门到精通100讲(二十五)-AutoSar架构中的Methodology
AUTOSAR为汽车电子软件系统开发定义了通用的技术方法,即AUTOSAR方法论.该方法论描述了从系统底层配置到ECU可执行代码产生过程的设计步骤. AUTOSAR开发方法是基于虚拟功能总线的开发方法 ...
最新文章
- 力扣: 268. 丢失的数字
- mess组网 中继_取代中继/子母路由 堪称最上乘的Mesh组网方式了解下
- [转载]对复旦食堂的印象
- c语言编程顺序查找例题,C语言典型编程例题.doc
- exec go 重启_[译]Golang中的优雅重启
- cygwin中访问windows分区
- paip.c++ sqlite数据库操作总结
- The Semantics of Constructors(拷贝构造函数之编译背后的行为)
- 《UNIX环境高级编程》随书代码的打开方式
- 华为悦盒烧写Ubuntu系统刷机教程
- Vue 使用 Echarts 显示热力地图信息
- python模拟ios,python模拟点击在ios中实现的实例讲解
- 全角半角英文字母及符号
- 根目录在哪里 根目录下的目录有什么作用
- 购房选址分析之上海市
- python网络爬虫之淘宝订单提取
- SQL员工基本工资表题目及答案
- 5G网络入门基础--5G网络的实现流程
- ajax提交多个form表单
- Bzoj3261/洛谷P4735 最大异或和(可持久化Trie)
热门文章
- php留言板只能留言一次,php如何实现留言板修改留言
- SpringBoot mybatis 输出SQL语句到控制台
- 在线作图|如何画韦恩图(包含upset图)
- 生物技术行业十年回顾:微生物组发展未达预期?
- MPB:林科院袁志林组-​原生质体法制备根系腐生型共生菌(伞菌目)单核化菌丝...
- ISME:中科院动物所张知彬组揭示肠道微生物介导了降雨变化对布氏田鼠种群的上行效应
- Cell二连发 | 广东CDC/耶鲁大学利用纳米孔测序揭示中/美新冠病毒基因组流行病学传播规律...
- MER: 基于ITS区域marker扩增真菌群落的准确性
- 2019年上半年国内学者在植物领域共发表6篇Science, 1篇Nature,1篇Cell!
- 水稻微生物组时间序列分析