二叉树的遍历

递归实现二叉树的遍历 

 

在遍历的过程中,每个节点都会遍历三次

二叉树的遍历

package binarytree;public class Traverse {public static class Node{public int value;public Node left;public Node right;public Node(int data){this.value = data;}}public static void traverse(Node node) {//每个子树的头节点if (node == null) {return;}//指向左节点traverse(node.left);//从左子树出来回到head节点//指向右节点traverse(node.right);//从右子树出来回到head节点}
}

先序遍历

    //先序遍历public static void traverse_first(Node node) {if (node == null) {return;}System.out.println(node.value + " ");//第一次遍历时输出traverse_first(node.left);traverse_first(node.right);}

中序遍历 

    //中序遍历public static void traverse_medium(Node node) {if (node == null) {return;}traverse_medium(node.left);System.out.println(node.value + " ");//第二次遍历时输出traverse_medium(node.right);}

后序遍历

    //后序遍历public static void traverse_later(Node node) {if (node == null) {return;}traverse_later(node.left);traverse_later(node.right);System.out.println(node.value + " ");//第三次遍历时输出}

非递归实现二叉树的遍历

先序遍历

对于每个子树:

        头节点入栈 → 节点弹出 → 打印节点 → 右节点  &  左节点入栈

        弹出左节点 → 打印左节点 → 进入左子树 → (以左节点为头节点循环)→ 直到左子树的节点全部输出完成

        弹出右节点 → 打印右节点 → 进入右子树 → (以右节点为头节点循环)→ 直到右子树的节点全部输出完成

先右再左入栈保证出栈时的顺序是头左右

    //非递归先序遍历public static void traverse_first_nonrecursive(Node node) {if (node == null) {return;}Stack<Node> stack = new Stack<Node>();stack.add(node);while (!stack.isEmpty()) {node = stack.pop();//出栈System.out.println(node + " ");if (node.right != null) {stack.push(node.right);//右节点入栈}if (node.left != null) {stack.push(node.left);//左节点入栈}}}

后序遍历

先序遍历压栈时先右节点再左节点,出栈的顺序为头、左、右

如果在压栈是先左节点再右节点,出栈的顺序为头、右、左

将出栈的所有的节点放入另一个栈,出第二个栈的顺序为左、右、头

恰为后序遍历的顺序

    //非递归后序遍历public static void traverse_later_nonrecursive(Node node) {if (node == null) {return;}Stack<Node> stack1 = new Stack<Node>();Stack<Node> stack2 = new Stack<Node>();stack1.push(node);while (!stack1.isEmpty()) {node = stack1.pop();stack2.push(node);//在栈1出栈后压入栈2if (node.left != null) {stack1.push(node.left);//左节点入栈}if (node.right != null) {stack1.push(node.right);//右节点入栈}while (!stack2.isEmpty()) {System.out.println(stack2.pop().value + " ");//栈2弹出}}}

中序遍历

对于每个子树:

        整个子树的左子树全部入栈 → 依次弹出

        如果弹出的节点无右节点 → 直接打印该节点 → 弹出下一个 → 判断弹出的节点

        如果弹出的节点有右节点 → 右节点入栈 → (以右节点为头节点循环)→ 直到右子树的节点全部输出完成 → 弹出下一个

为什么这样遍历输出的顺序就是左、中、右?

        入栈时,头 → 左 ;出栈时,左 → 头

        出栈的时候不断判断节点是否有右节点插入右节点

        如果在右子树中存在左子树,则继续进行左 → 头的遍历

    //非递归中序遍历public static void traverse_medium_nonrecursive(Node node) {if (node == null) {return;}Stack<Node> stack = new Stack<Node>();while (!stack.isEmpty() && node != null) {if (node != null) {stack.push(node);node = node.left;//整个左子树入栈} else {node = stack.pop();//出栈System.out.println(node.value + " ");node = node.right;//如果右节点为null则弹出下一个,如果不为null则将右节点弹入栈}}}

如何完成二叉树的宽度的优先遍历

二叉树的深度遍历 = 二叉树的先序遍历

二叉树的宽度遍历:每一层从左到右横向遍历

        头节点入队列(先进先出),节点弹出打印,先放左再放右

     (类似于先序遍历,栈结构换为队列结构,先右再左换为先左再右)

package binarytree;import java.util.LinkedList;
import java.util.Queue;public class WidthTraversal {public static class Node {public int value;public Node left;public Node right;public Node(int data) {this.value = data;}}public static void widthTraversal(Node node){if(node == null){return;}Queue<Node> queue = new LinkedList<>();queue.add(node);while(!queue.isEmpty()){Node node0 = queue.poll();System.out.println(node0.value);if(node0.left != null){queue.add(node0.left);//先右节点入队列}if(node0.right != null){queue.add(node0.right);//再左节点入队列}}}
}

求一颗二叉树的宽度

1、使用HashMap结构记录某个节点所在的层数,在宽度遍历的时候统计每层的节点个数

        几个变量:int thisLevel,当前所在的层数

                          int thislevelNodes,当前层有多少个节点

                          int max,最大的层节点数

    //求二叉树的最大宽度public static Integer getmaxWidth(Node node) {if (node == null) {return Integer.MIN_VALUE;}int thislevel = 1;//当前所在的层数int thislevelNodes = 0;//当前层有多少个节点int max = Integer.MIN_VALUE;//最大的层节点数HashMap<Node, Integer> levelMap = new HashMap<>();//HashMap结构存储层数levelMap.put(node, 1);//头节点初始化Queue<Node> queue = new LinkedList<>();queue.add(node);while (!queue.isEmpty()) {Node node0 = queue.poll();if(thislevel == levelMap.get(node0)){thislevelNodes++;//个数++}else{thislevel++;max = Math.max(max,thislevelNodes);//存最大值thislevelNodes = 1;//当一个节点不等于当前节点,此时node0节点已经来到了下一行节点,所以初始值为1}//记录层数if (node0.left != null) {queue.add(node0.left);//先右节点入队列levelMap.put(node0.left, thislevel + 1);//当前节点的左孩子在下一层}if (node0.right != null) {queue.add(node0.right);//再左节点入队列levelMap.put(node0.right, thislevel + 1);//当前节点的右孩子在下一层}}return Math.max(max,thislevelNodes);//最后一行的节点仍需和max比较取较大值}

2、不使用哈希表

几个变量:

        Node thisEnd,当前行最后一个节点

        Node nextEnd,下一行最后一个节点

        int nextLevel,下一层发现的节点数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/155696.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++视觉图像----扩充边界

图像扩充边界 #include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp>int main() {// 读取图像cv::Mat image cv::imread("1.jpg", cv::IMREAD_COLOR);if (image.empty()) {std::cerr << "Could not open or find the imag…

NC56 自定义查询的维护

前言 昨天收到一个业务反馈&#xff0c;某公司自定义查询的销售订单、和手工核销的数据对不上了。于是进行了简单的排查和分析。顺带了解了 NC56 的自定义查询的维护方法。 操作位置 在【客户化 - 自定义查询 - 查询引擎 - 查询引擎管理 】找到对应的自定义查询。并且点击右…

机器学习基础之《回归与聚类算法(1)—线性回归》

一、线性回归的原理 1、线性回归应用场景 如何判定一个问题是回归问题的&#xff0c;目标值是连续型的数据的时候 房价预测 销售额度预测 贷款额度预测、利用线性回归以及系数分析因子 2、线性回归定义 线性回归(Linear regression)是利用回归方程(函数)对一个或多个自变量(…

升级MacOS后无法打开 Parallels Desktop,提示“要完成 Parallels Desktop 设置,请重新启动 Mac 。”

有用户升级macOS后&#xff0c;发现无法打开PD虚拟机了&#xff0c;提示“要完成 Parallels Desktop 设置&#xff0c;请重新启动 Mac 。”但是重启电脑之后&#xff0c;尝试了卸载重装&#xff0c;安装新版本&#xff0c;都无法解决问题&#xff0c;打开依旧如此提示&#xff…

2023-2024-1 高级语言程序设计实验一: 选择结构

7-1 古时年龄称谓知多少&#xff1f; 输入一个人的年龄&#xff08;岁&#xff09;&#xff0c;判断出他属于哪个年龄段 &#xff1f; 0-9 &#xff1a;垂髫之年&#xff1b; 10-19&#xff1a; 志学之年&#xff1b; 20-29 &#xff1a;弱冠之年&#xff1b; 30-39 &#…

C++入门篇---(1)命名空间与缺省参数

1.前言: c兼容C语言,C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加了许多有用的库&#xff0c;以及编程范式等。 因此你可以理解为c是在c语言的基础上进行扩展的升级版. 它补充了C语言语法的不足&#xff0c;以及C是如何对C语言设计不合理…

第二证券:汇金增持有望催化银行板块 白酒企稳信号凸显

昨日&#xff0c;两市股指盘中震动上扬&#xff0c;创业板指、科创50指数一度涨超1%&#xff0c;但沪指午后涨幅逐渐回落。到收盘&#xff0c;沪指涨0.12%报3078.96点&#xff0c;深成指涨0.35%报10084.89点&#xff0c;创业板指涨0.8%报2003.9点&#xff0c;科创50指数涨1.29%…

在SIP 语音呼叫中出现单通时要怎么解决?

在VoIP的环境中&#xff0c;特别是基于SIP通信的环境中&#xff0c;我们经常会遇到一些非常常见的问题&#xff0c;例如&#xff0c;单通&#xff0c;注册问题&#xff0c;回声&#xff0c;单通等。这些问题事实上都有非常直接的排查方式和解决办法&#xff0c;用户可以按照一定…

分类预测 | MATLAB实现基于RF-Adaboost随机森林结合AdaBoost多输入分类预测

分类预测 | MATLAB实现基于RF-Adaboost随机森林结合AdaBoost多输入分类预测 目录 分类预测 | MATLAB实现基于RF-Adaboost随机森林结合AdaBoost多输入分类预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于RF-Adaboost随机森林结合AdaBoost多输…

uniapp app获取keystore等一系列常用数据

https://blog.csdn.net/deepdfhy/article/details/88698492 参考文章 一、获取安卓证书keystore的SHA1和SHA256值 参数上面引用链接 window r : $ cmd $ D: 进入D盘 $ keytool -genkey -alias testalias -keyalg RSA -keysize 2048 -validity 36500 -keystore 项目名称.ke…

华为云云耀云服务器L实例评测|华为云上的CentOS性能监测与调优指南

目录 引言 ​编辑1 性能调优的基本要素 2 性能监控功能 2.1 监控数据指标 2.2 数据历史记录 2.3 多种统计指标 3 性能优化策略 3.1 资源分配 3.2 磁盘性能优化 3.3 网络性能优化 3.4 操作系统参数和内核优化 结论 引言 在云计算时代&#xff0c;性能优化和调优对于…

SNAP处理数据C盘越用越小,Datatype out of range报错

SNAP处理数据C盘越用越小&#xff0c;Datatype out of range报错 问题描述 SNAP处理的影像比较多了之后&#xff0c;占用C盘临时存储空间&#xff0c;在做处理时&#xff0c;一直报错Datatype out of range 原因 临时存储不够了&#xff0c;需要释放一下之前的空间。 解决…

【【萌新的SOC学习之GPIO之MIO控制LED实验程序设计】】

萌新的SOC学习之GPIO之MIO控制LED实验程序设计 如何设置完GPIO并且传递数据 我们先了解GPIO引脚的配置 每一个GPIO引脚都可以设置成输入输出 &#xff0c;只有GPIO8 7 只能作为输出 我们现在做一个例子 GPIO 的bank我们知道有4个 bank0 1 2 3 DIRM_0 就是第一个bank 需要写入…

MyBatis基础之注解与SQL 语句构建器

文章目录 注解实现简单增删改查SQL 语句构建器SelectProvider举例 注解实现简单增删改查 在 MyBatis 的核心配置文件中&#xff0c;你需要配置的不是 mapper 映射文件&#xff0c;而是 Mapper 接口所在的包路径。 <!-- 在配置文件中 关联包下的 接口类--> <mappers&…

计算时间复杂度

时间复杂度与语句被重复执行的次数息息相关。 一、单层循环 单层循环大致可以分为两种&#xff0c;一种是循环体内的语句不影响循环条件的判定。另一种就是循环体内的语句会影响循环条件的判定。 1、循环体内的语句不影响循环条件的判定 这种情况十分常见且简单&#xff0c…

智慧政务大屏建设方案

智慧政务大屏建设方案是为政府部门提供信息化展示和决策支持的重要工具。下面将提供一个详细的智慧政务大屏建设方案&#xff0c;包括硬件设备、软件平台和功能模块等。 **一、硬件设备** 智慧政务大屏的硬件设备需要满足以下基本要求&#xff1a; 1. 显示屏&#xff1a;选择…

(5)SpringMVC处理携带JSON格式(“key“:value)请求数据的Ajax请求

SpringMVC处理Ajax 参考文章数据交换的常见格式,如JSON格式和XML格式 请求参数的携带方式 浏览器发送到服务器的请求参数有namevalue&...(键值对)和{key:value,...}(json对象)两种格式 URL请求和表单的GET请求会将请求参数以键值对的格式拼接到请求地址后面form表单的P…

基于若依ruoyi-nbcio支持flowable流程增加自定义业务表单(二)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 之前讲了自定义业务表单&#xff0c;现在讲如何与流程进行关联 1、后端部分 WfCustomFormMapper.xml &…

Python并行编程之道—加速海量任务同时执行

这次我要和大家分享一种加速海量任务执行的方法&#xff0c;那就是Python并行编程。如果你经常处理大量的任务&#xff0c;并且希望能够同时执行它们以提高效率&#xff0c;那么并行编程将会给你带来巨大的帮助&#xff01; 1、了解并行编程 并行编程是利用多个执行单元同时执…

Talk | ACL‘23 杰出论文,MultiIntruct:通过多模态指令集微调提升VLM的零样本学习

本期为TechBeat人工智能社区第536期线上Talk&#xff01; 北京时间10月11日(周三)20:00&#xff0c;弗吉尼亚理工大学博士生—徐智阳、沈莹的Talk已准时在TechBeat人工智能社区开播&#xff01; 他们与大家分享的主题是: “通过多模态指令集微调提升VLM的零样本学习”&#xff…