二叉树的遍历分为三种:前序遍历 中序遍历 后序遍历

  • 前序遍历:按照“根左右”,先遍历根节点,再遍历左子树 ,再遍历右子树
  • 中序遍历:按照“左根右“,先遍历左子树,再遍历根节点,最后遍历右子树
  • 后续遍历:按照“左右根”,先遍历左子树,再遍历右子树,最后遍历根节点
    其中前,后,中指的是每次遍历时候的根节点被遍历的顺序
    ============

二叉树遍历的java实现

package 树;import java.util.ArrayList;
import java.util.List;public class Tree {private Node root;private List<Node> list=new ArrayList<Node>();public Tree(){init();}//树的初始化:先从叶节点开始,由叶到根public void init(){Node x=new Node("X",null,null);Node y=new Node("Y",null,null);Node d=new Node("d",x,y);Node e=new Node("e",null,null);Node f=new Node("f",null,null);Node c=new Node("c",e,f);Node b=new Node("b",d,null);Node a=new Node("a",b,c);root =a;}//定义节点类:private class Node{private String data;private Node lchid;//定义指向左子树的指针private Node rchild;//定义指向右子树的指针public Node(String data,Node lchild,Node rchild){this.data=data;this.lchid=lchild;this.rchild=rchild;}}/*** 对该二叉树进行前序遍历 结果存储到list中 前序遍历:ABDXYCEF*/public void preOrder(Node node){list.add(node); //先将根节点存入list//如果左子树不为空继续往左找,在递归调用方法的时候一直会将子树的根存入list,这就做到了先遍历根节点if(node.lchid != null){preOrder(node.lchid);}//无论走到哪一层,只要当前节点左子树为空,那么就可以在右子树上遍历,保证了根左右的遍历顺序if(node.rchild != null){preOrder(node.rchild);}}/*** 对该二叉树进行中序遍历 结果存储到list中*/public void inOrder(Node node){if(node.lchid!=null){inOrder(node.lchid);}list.add(node);if(node.rchild!=null){inOrder(node.rchild);}}/*** 对该二叉树进行后序遍历 结果存储到list中*/public void postOrder(Node node){if(node.lchid!=null){postOrder(node.lchid);}if(node.rchild!=null){postOrder(node.rchild);}list.add(node);}/*** 返回当前数的深度*  说明:*  1、如果一棵树只有一个结点,它的深度为1。*  2、如果根结点只有左子树而没有右子树,那么树的深度是其左子树的深度加1;*  3、如果根结点只有右子树而没有左子树,那么树的深度应该是其右子树的深度加1;*  4、如果既有右子树又有左子树,那该树的深度就是其左、右子树深度的较大值再加1。*  * @return*/public int getTreeDepth(Node node) {if(node.lchid == null && node.rchild == null){return 1;}int left=0,right = 0;if(node.lchid!=null){left = getTreeDepth(node.lchid);}if(node.rchild!=null){right = getTreeDepth(node.rchild);}return left>right?left+1:right+1;}//得到遍历结果public List<Node> getResult(){return list;}public static void main(String[] args) {Tree tree=new Tree();System.out.println("根节点是:"+tree.root);//tree.preOrder(tree.root);tree.postOrder(tree.root);for(Node node:tree.getResult()){System.out.println(node.data);}System.out.println("树的深度是"+tree.getTreeDepth(tree.root));} }

我的总结:

二叉树是一个相当重要的数据结构,它的应用面非常广,并且由他改进生成了很多重要的树类数据结构,如红黑树,堆等,应用价值之高后面深入学习便有体会,因此,掌握它的基本特征和遍历方式实现是学好后续数据结构的基础,理论方面其实我们看到二叉树的形状,我们自己画图都能总结出来,但是代码实现这一块,初学者不是很好理解,树的遍历利用了递归的思想,递归的思想本质无非就是循环,方法调方法,所以,理解二叉树遍历的代码实现最好的方式就是按照它的遍历思想自己画出图来一步一步的遍历一遍,先把这个遍历过程想明白了,然后再根据递归的思想,什么时候调什么样的方法,自然就能很容易想明白了

--------------------- 作者:GFJ0814 来源:CSDN 原文:https://blog.csdn.net/gfj0814/article/details/51637696?utm_source=copy 版权声明:本文为博主原创文章,转载请附上博文链接!

如何遍历一棵二叉树?相关推荐

  1. C语言递归遍历一棵二叉树(附完整源码)

    C语言递归遍历一棵二叉树 结点结构体定义 二叉树递归遍历方式 完整实现和main测试源码 结点结构体定义 struct node {struct node *leftNode;int data;str ...

  2. 【图解二叉树】如何用中序遍历一棵二叉树?(三种解法)

    目录 题解 递归实现 迭代实现 莫里斯遍历 题解 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1\2/3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过 ...

  3. 判断一棵二叉树是否为搜索二叉树、完全二叉树、平衡二叉树(java)

    平衡二叉树的解法:主要是求出二叉树的高度,若根节点的左子树的高度与右子树的高度差小于等于1,则表示该二叉树为平衡二叉树 public static class Node{public int valu ...

  4. java 二叉树 遍历_JAVA实现二叉树(简易版--实现了二叉树的各种遍历)

    1 packagetree;2 3 importjava.util.ArrayDeque;4 importjava.util.ArrayList;5 importjava.util.List;6 im ...

  5. 二叉树的先序、中序、后序、层序遍历方式详解,由遍历序列构造二叉树过程详解以及C++代码详细实现

    二叉树的遍历 树与二叉树的定义.性质,二叉树的顺序存储结构.链式存储结构 二叉树的遍历是指按某条搜索路径访问树中每个结点,使得每个结点均被访问一次,而且仅被访问一次.由于二叉树是一种非线性结构,每个结 ...

  6. 手动创建一棵二叉树,然后利用前序、中序、后序、层序进行遍历(从创建二叉树到各种方式遍历)(含运行结果)

    手动创建一棵二叉树,然后利用前序.中序.后序.层序进行遍历 import java.util.LinkedList; import java.util.List; import java.util.Q ...

  7. 【7-10 PAT】树的遍历(给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。)

    题干: 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 解题报告: dfs求出这棵树来,然后bfs求层序遍历就行了. AC代码: #include&l ...

  8. 哪两种遍历方式可以唯一确定一棵二叉树,结合力扣105题

    对于一棵树的前中序三种顺序的遍历方式,任何一种单独拿出来都无法确定一棵树,那么两种遍历方式得到的节点数据能否构建一棵二叉树呢? 先来看看能有哪几种组合: 先序遍历 + 中序遍历 后序遍历 + 中序遍历 ...

  9. pta习题:给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。

    5-6 树的遍历 分数 20 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一 ...

最新文章

  1. SSC:面向大规模场景识别的语义扫描context(IROS2021)
  2. 红旗6SP1版不克不及显示NTFS内的中文文件
  3. BZOJ 1834 Luogu P2604 [ZJOI2010]网络扩容 (最小费用最大流)
  4. 参数校验放在controller还是service_@Validated校验的实践
  5. shiro(1) 介绍
  6. 驱动过滤透明加密微过滤驱动回顾
  7. c语言炒股软件公式,股票软件怎么使用指标选股公式
  8. 实操:(附环摄数据及三维模型)如何利用Smart3D将二维照片转换成三维模型?
  9. Java的指针碰撞简介
  10. 使用UltraISO制作光盘镜像
  11. 分享:HTML转义字符大全
  12. h5手机拍照+人脸识别
  13. 长篇幅详解辐射定标、大气校正、监督分类、掩膜统计、植被覆盖度操作
  14. 满足多元化场景需求,戴尔显示器新品绚丽亮相
  15. 如何有效解决电脑桌面开始菜单不见了
  16. 【爬虫】 静态网页抓取
  17. dedecms织梦系统安装步骤
  18. 2022G1工业锅炉司炉考试题库及模拟考试
  19. ML之prophet:利用prophet算法对上海最高气温实现回归预测(时间序列的趋势/周季节性趋势/年季节性趋势)案例
  20. PS定义图案 和LOGO总结

热门文章

  1. win7平台下QT软件的打包与发布(部署与安装) 打包成安装包样式
  2. Zotero的MDPI参考文献标注模板资源,导入直接使用。
  3. echarts3.x,echarts5.x 的wordCloud兼容
  4. java 试题_Java笔试题完整试卷
  5. lua sha256算法函数封装
  6. 联通用户的福利,不了解就拉倒!
  7. 数据集格式转换一:DarkLabelToMOT
  8. cad打开卡死_cad2010打开就卡死怎么回事_教你解决cad2010打开就卡死问题
  9. 删除的微信聊天记录如何恢复
  10. DOS游戏手柄键盘映射说明书