当前位置: 首页 > news >正文

树的遍历方式总结

以此树为demo
在这里插入图片描述

先序遍历

定义:优先访问根节点,然后访问左子树,最后访问右子树,根节点->左子树->右子树
按照定义,那么上述demo的结果可以很好得出来:A->B->D->G->H->E->I->C->F
那么算法怎么实现呢?这里使用递归方法:

public static void nlr(TreeNode rootNode) {TreeNode leftChild;TreeNode rightNode;if (rootNode != null) {System.out.print(rootNode.data+" ");leftChild = rootNode.leftChild;nlr(leftChild);rightNode = rootNode.rightChild;nlr(rightNode);}
}

运行结果如下:
在这里插入图片描述

中序遍历

定义:优先访问左子树,然后访问根节点,然后访问右子树,左子树->根节点->右子树
按照定义,那么上述demo的结果可以很好得出来:G->D->H->B->E-I->A->C->F

public static void lnr(TreeNode rootNode) {TreeNode leftChild;TreeNode rightNode;if (rootNode != null) {leftChild = rootNode.leftChild;lnr(leftChild);System.out.print(rootNode.data+" ");rightNode = rootNode.rightChild;lnr(rightNode);}
}

运行结果如下:
在这里插入图片描述

后续遍历

定义:优先访问左子树,然后访问右子树,然后访问根节点,左子树->右子树->根节点
按照定义,那么上述demo的结果可以很好得出来:G->H->D->I->E->B->F->C->A

public static void lrn(TreeNode rootNode) {TreeNode leftChild;TreeNode rightNode;if (rootNode != null) {leftChild = rootNode.leftChild;lrn(leftChild);rightNode = rootNode.rightChild;lrn(rightNode);System.out.print(rootNode.data+" ");}
}

运行结果如下:
在这里插入图片描述

按层遍历

定义:广度优先遍历,优先访问节点的左子树和右子树
使用队列方式来,每个节点判断一下有没有左右子树,有的话直接offer进队列,然后不停的输出队列即可

public static void storey(TreeNode rootNode) {//使用队列,先进先出Queue<TreeNode> queue = new LinkedList<>();queue.offer(rootNode);while (!queue.isEmpty()) {TreeNode t = queue.poll();System.out.print(t.data+" ");if (t.leftChild != null) {queue.offer(t.leftChild);}if (t.rightChild != null) {queue.offer(t.rightChild);}}
}

运行结果:
在这里插入图片描述

获取层数(获取二叉树最大深度)

相当于按层遍历的进阶了

public static void storey2(TreeNode rootNode) {//使用队列,先进先出Queue<TreeNode> queue = new LinkedList<>();queue.offer(rootNode);int n;int levelN =  1;int count = 0;System.out.print(rootNode.data);while (!queue.isEmpty()) {n = levelN;    //上一层的节点数量赋值给nlevelN = 0;   //清空leveN,开始重新计算当前行的节点数,给下一层使用System.out.println();for (int i=0;i<n;i++) {   //n表示这一行的所有节点数量,n的值依赖于上一层的levelN的值TreeNode t = queue.poll();if (t.leftChild != null) {queue.offer(t.leftChild);levelN++;   //节点数量+1System.out.print(t.leftChild.data+" ");}if (t.rightChild != null) {queue.offer(t.rightChild);levelN++;   //节点数量+1System.out.print(t.rightChild.data+" ");}}count++;   //开始换行}System.out.print("行数:"+count);
}

运行结果如下:
在这里插入图片描述
优化写法:leftchild和rightchild offer进队列的时候,不急着poll出来,等到当前层的所有节点的左右子树都offer进去的时候,再进行下一次循环,这时候队列数量就是当前层的节点数量,然后继续下一层遍历,本质上和上文写的逻辑一样,只不过不需要额外的变量了。

public static void storey2(TreeNode rootNode) {//使用队列,先进先出Queue<TreeNode> queue = new LinkedList<>();queue.offer(rootNode);int count = 0;System.out.print(rootNode.data);while (!queue.isEmpty()) {int n = queue.size();   //临时保存队列数量,队列数量就是当前层节点数量System.out.println();for (int i=0;i<n;i++) {   //循环当前层的节点数量TreeNode t = queue.poll();if (t.leftChild != null) {queue.offer(t.leftChild);System.out.print(t.leftChild.data+" ");}if (t.rightChild != null) {queue.offer(t.rightChild);System.out.print(t.rightChild.data+" ");}}count++;}System.out.print("行数:"+count);
}

其他二叉树的进阶算法,后续记录在leetcode分类栏目中

http://www.dtcms.com/a/435472.html

相关文章:

  • excel做网站链接网站流量一直下降
  • VS2017 安装 .NET Core 2.2 SDK 教程(包括 dotnet-sdk-2.2.108-win-x64.exe 安装步骤)​
  • 模拟算法
  • 网站建设需要收集资料吗网络营销中的四种方法
  • 能源经济选题推荐:绿色电网
  • 展览展示搭建设计晋中网站seo
  • 如何让做树洞网站郑州搜索引擎优化公司
  • 网站制作推广电话阿里云安装wordpress
  • 做网站设计电脑买什么高端本好潜江资讯网手机
  • 教育建设网站网络营销课程总结1000字
  • 在百度里面做个网站怎么做wordpress go链接跳转错误
  • h5网站建设建站刚刚做的网站怎么排名
  • 信用中国 网站 支持建设形象设计
  • MySQL 和 Redis 偏移量分页在数据增删场景下的问题与解决方案
  • 赚钱的十大个人网站场口一站式建站哪家公司好
  • 罗源福州网站建设成都 网站建设公司哪家好
  • 雅联网站建设网站怎么被收录
  • 网站公司怎么做运营商做网站和软件哪个挣钱
  • DeepSeek 最新推出 ‌EX 模型
  • C++之二叉树进阶
  • 重庆网站设计案例没有网站怎么做CPC
  • 算术与比较运算符详解
  • 英语学习-Saints041
  • php 英文网站模板asp.net 大网站
  • 常见的有利于seo的网站系统网站数据没有更新
  • QT肝8天08--主界面设计
  • 帮别人做海报网站打开一个不良网站提示创建成功
  • 网站横幅背景图片编写网站策划方案
  • zbrush 自定义笔刷快捷键
  • dedecms网站关键词企业网站色彩