算法day09 二叉树

class Node<V>{V  value;Node left;Node right;
}

一、用递归和非递归分别实现二叉树的前序,中序,后序遍历

        非递归方式:

 前序遍历  根左右

           0)利用stack后进先出的特点

                        要输出根左右的顺序,将元素右边先放入栈中元素左边后放入栈中,实现先弹出左边元素再弹出右边元素。

           1) 入栈顺序:

                              ①入栈,弹出;弹出的①视为根节点

                              每次while循环只看这一颗小树:

                               ③入栈,②入栈;

                                第二次while循环,弹出的②视为根节点:

                                ⑤入栈 , ④入栈

                                第三次while循环,弹出的④视为根节点:

                                没有元素入栈                      

                                第四次while循环,弹出的⑤视为根节点:

                                没有元素入栈

                                第五次while循环,弹出的③视为根节点:

                                ⑦入栈 ,  ⑥入栈

                                . . . . . .

              2)代码实现                  

import java.util.Stack;public class Main {public static void main(String[] args) {TreeNode root = new TreeNode(1);root.left = new TreeNode(2);root.left.left = new TreeNode(4);root.left.right = new TreeNode(5);root.right = new TreeNode(3);root.right.left = new TreeNode(6);root.right.right = new TreeNode(7);System.out.println("Inorder Traversal:");InorderTraversal.inorderTraversal(root); }
}class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) { val = x; }
}class InorderTraversal {public static void inorderTraversal(TreeNode root) {Stack<TreeNode> stack = new Stack<>();TreeNode current = root;stack.push(current);while ( !stack.isEmpty()) {// while (current != null) {//     stack.push(current);//     current = current.left;// }// current = stack.pop();// System.out.print(current.val + " ");// current = current.right;current  =  stack.pop();System.out.print(current.val+ " ");if(current.right!=null){stack.push(current.right);}if(current.left!=null){stack.push(current.left);}}}
}


               中序遍历  左根右

                        实现左根右的输出,从根节点①加入栈开始,再将所有左节点元素②、④依次加入到栈中        

                        再根据栈的弹出找到最左边最先输出的树,

                                弹出④,再以④为根节点找④右子节点的元素,没有进入下次循环

                        每一次while循环只看根据栈的弹出的这一颗树

                                弹出②,这时根节点为②,找右子节点⑤

                        接着while循环以⑤为根节点

                                将从根节点⑤加入栈开始,如果⑤有左右节点的话,再将所有左节点元素加入到栈

                        . . . . . .

                        实质上发现while循环还是递归的另一种形式。

import java.util.Stack;public class Main {public static void main(String[] args) {TreeNode root = new TreeNode(1);root.left = new TreeNode(2);root.left.left = new TreeNode(4);root.left.right = new TreeNode(5);root.right = new TreeNode(3);root.right.left = new TreeNode(6);root.right.right = new TreeNode(7);System.out.println("Inorder Traversal:");InorderTraversal.inorderTraversal(root); // Output should be 4 2 5 1 6 3 7}
}class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) { val = x; }
}class InorderTraversal {public static void inorderTraversal(TreeNode root) {Stack<TreeNode> stack = new Stack<>();TreeNode current = root;while (current!=null || !stack.isEmpty()) {while (current != null) {stack.push(current);current = current.left;}current = stack.pop();System.out.print(current.val + " ");current = current.right;}}
}


              后序遍历  左右根

                        再前序遍历的基础上,每次弹栈出的元素放入到新栈中,就能实现将根左右转换为右左根的顺序。

                        实现左右根的顺序,只需要将原来的根左右变为根右左。

        

import java.util.Stack;public class Main {public static void main(String[] args) {TreeNode root = new TreeNode(1);root.left = new TreeNode(2);root.left.left = new TreeNode(4);root.left.right = new TreeNode(5);root.right = new TreeNode(3);root.right.left = new TreeNode(6);root.right.right = new TreeNode(7);System.out.println("Inorder Traversal:");InorderTraversal.inorderTraversal(root); }
}class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) { val = x; }
}class InorderTraversal {public static void inorderTraversal(TreeNode root) {Stack<TreeNode> stack = new Stack<>();Stack<TreeNode> stack2 = new Stack<>();TreeNode current = root;stack.push(current);while ( !stack.isEmpty()) {// while (current != null) {//     stack.push(current);//     current = current.left;// }// current = stack.pop();// System.out.print(current.val + " ");// current = current.right;current  =  stack.pop();stack2.push(current);//  System.out.print(current.val+ " ");if(current.left!=null){stack.push(current.left);}if(current.right!=null){stack.push(current.right);}}while(!stack2.isEmpty()){System.out.print(stack2.pop().val);}}
}


二、直观的打印一颗二叉树                                                            



三、二叉树的宽度优先遍历 , 找层级最大节点数

             第一种方式:

                            1)实现层级遍历

                            2)哈希表记录每一节点对应的层级

                            3)统计每一层级对应节点数         

      

         第二种方式:

                      针对二叉树结构,使用队列,滚动更新变量。

                      定义四个变量:

                              currentEnd   null       当前层级最后节点对象

                              nextEnd    null           队列中最后一个节点对象

                              levelNum     0             当前层级节点数      

                              max    null            最大值 

                      遍历过程:从根节点①开始        

                              ①入栈:

                                        levelNum = 1

                                        current = ①        

                              ①出栈:左右孩子分别进栈                

                                        ②入栈, next = ②  

                                        ③入栈, next = ③ 

                                        ①和current相同:     

                                                max  =  levelNum

                                                levelNum = 0   //重置计数

                                                current =  next = ③

                                                next = null       //重置下一层级最后节点对象

                               ②出栈,孩子进队列

                                        ④入栈,next为④

                                        levelNum = 1

                                        ②与current不相同

                               ③出栈,孩子进队列

                                        ⑤入栈,next为⑤

                                        ⑥入栈,next为⑥

                                         levelNum++       

                                        ③与current相同:

                                                max  =  levelNum

                                                levelNum = 0  //重置计数

                                                current =  next = ⑥

                                                next = null       //重置下一层级最后节点对象

                              . . . . . .                         

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【CanMV K230】圆形检测

【CanMV K230】圆形检测 什么是圆形检测圆形检测应用领域1.工业自动化2.机器人视觉3.医学图像分析4.目标识别5.质量检测6.研究和开发 K230应用相关函数官方例程HDMI屏幕使用圆形检测 本篇内容&#xff1a; 什么是圆形检测圆形检测应用领域K230应用&#xff08;包含相应函数及例…

SAP学习笔记 - 开发03 - CDSView开发环境搭建,Eclipse中连接SAP,CDSView创建

上一章讲了BTP的账号创建&#xff0c;环境搭建等内容。 SAP学习笔记 - 开发02 - BTP实操流程&#xff08;账号注册&#xff0c;BTP控制台&#xff0c;BTP集成开发环境搭建&#xff09;-CSDN博客 本章继续讲SAP开发。 - CDSView 的开发环境&#xff08;Eclipse&#xff09;搭建…

C++初阶:STL详解(一)——string类

✨✨小新课堂开课了&#xff0c;欢迎欢迎~✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C&#xff1a;由浅入深篇 小新的主页&#xff1a;编程版小新-CSDN博客 1.为什么会有string类 C 语言中&#xff0c…

驾驭不断发展的人工智能世界

从很多方面来看&#xff0c;历史似乎正在重演。许多企业正争相采用生成式人工智能 (Gen AI)&#xff0c;就像它们争相采用云计算一样&#xff0c;原因也是一样的&#xff1a;效率、成本节约和竞争优势。 然而&#xff0c;与云一样&#xff0c;GenAI 仍是一项发展中的技术&…

Kafka 分布式消息系统详细介绍

Kafka 分布式消息系统 一、Kafka 概述1.1 Kafka 定义1.2 Kafka 设计目标1.3 Kafka 特点 二、Kafka 架构设计2.1 基本架构2.2 Topic 和 Partition2.3 消费者和消费者组2.4 Replica 副本 三、Kafka 分布式集群搭建3.1 下载解压3.1.1 上传解压 3.2 修改 Kafka 配置文件3.2.1 修改z…

网络原理之TCP协议(万字详解!!!)

目录 前言 TCP协议段格式 TCP协议相关特性 1.确认应答 2.超时重传 3.连接管理&#xff08;三次握手、四次挥手&#xff09; 三次握手&#xff08;建立TCP连接&#xff09; 四次挥手&#xff08;断开连接&#xff09; 4.滑动窗口 5.流量控制 6.拥塞控制 7.延迟应答…

gazebo 已加载模型但无法显示

目录 写在前面的话问题一&#xff1a;robot_state_publisher 发布机器人信息失败报错一 Error: Error document empty.报错二 .xcaro 文件中有多行注释成功启动 问题二&#xff1a;通过 ros2 启动 gazebo 失败成功启动 问题三&#xff1a;gazebo 崩溃和无法显示模型问题四&…

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证&#xff1a;Authentication1.2 鉴权&#xff1a;Authorization1.3 准入控制&#xff1a;Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes…

Pr:首选项 - 音频

Pr菜单&#xff1a;编辑/首选项 Edit/Preferences Premiere Pro 首选项中的“音频” Audio选项卡主要作用是控制音频的处理设置&#xff0c;包括音量调整、波形生成、音频渲染等选项&#xff0c;这些设置有助于优化音频的处理和编辑工作&#xff0c;适用于不同的剪辑需求和项目…

VS Code 调试go程序的相关配置说明

用 VS code 调试Go程序需要在.vscode/launch.json文件中增加如下配置&#xff1a; // launch.json {// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.…

RISC-V (十二)系统调用

系统模式&#xff1a;用户态和内核态 当前的代码都是实现在machine模式下。 系统模式的切换 epc寄存器的值存放的是ecall指本身的地址 。 用ecall指令 系统调用的执行流程 mret这条指令会利用status的mpp值恢复到之前的特权级别。 蓝色的线表示涉及到权限切换。 系统调用的传…

想要从OPPO手机恢复数据?免费OPPO照片视频恢复软件

此实用程序可帮助那些寻找以下内容的用户&#xff1a; 在OPPO手机中格式化存储卡后可以恢复图片吗&#xff1f;我删除了 OPPO上的视频和图片&#xff0c;我感觉很糟糕&#xff0c;因为里面有我在拉斯维加斯拍摄的视频和照片 免费OPPO照片视频恢复软件 您能恢复OPPO上已删除的…

JavaScript拷贝的艺术:玩转深拷贝和浅拷贝

前言 在实际的项目开发中&#xff0c;我们时刻都在使用数据拷贝功能&#xff0c;赋值、深拷贝和浅拷贝是前端开发中常见的概念&#xff0c;用于复制简单数据类型&#xff08;字符串、数值、布尔值&#xff09;和引用类型&#xff08;对象、数组&#xff09;。它们的主要区别在…

spring中添加@Test注解测试

1、添加maven依赖 <!-- 添加test方便测试--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency><dependency><grou…

C语言进阶版第8课—指针(2)

文章目录 1. 数组名的理解2. 指针访问数组3. 一维数组传参本质4. 冒泡排序5. 二级指针6. 指针数组7. 指针数组模拟二维数组 1. 数组名的理解 sizeof&#xff08;数组名&#xff09;— 这里的数组名代表整个数组&#xff0c;计算的也是整个数组的大小&数组名 — 这里的数组名…

HTML 基础,尚优选网站设计开发(二)

最近在恶补HTML相关知识点&#xff0c;本人是后端程序员&#xff0c;看到周围很多人都被裁员了&#xff0c;突然想尽早转变成全栈程序员变成独立开发者&#xff0c;有空余接接私单、商单的 尚优选网站设计开发&#xff0c;HTMLCSSJavaScript实际使用 尚优选网站设计开发页面分析…

KDD 2024 时空数据(Spatio-temporal) Research论文总结

2024 KDD&#xff08; ACM SIGKDD Conference on Knowledge Discovery and Data Mining, 知识发现和数据挖掘会议&#xff09;在2024年8月25日-29日在西班牙巴塞罗那举行。 本文总结了KDD2024有关时空数据(Spatial-temporal) 的相关论文&#xff0c;如有疏漏&#xff0c;欢迎大…

初步了解VTK装配体

VTK还不太了解&#xff0c;根据资料&#xff0c; vtk.vtkAssembly 是 VTK库中的一个重要类&#xff0c;允许通过将多个vtkActor对象组合在一起来创建复杂的3D模型。 import vtk import math from vtk.util.colors import *filenames ["cylinder.stl","sphere…

打破AI壁垒-降低AI入门门槛

AI和AGI AI&#xff08;人工智能-Artificial Intelligence&#xff09;&#xff1a; 先说说AI&#xff0c;这个大家可能都不陌生。AI&#xff0c;就是人工智能&#xff0c;它涵盖了各种技术和领域&#xff0c;目的是让计算机模仿、延伸甚至超越人类智能。想象一下&#xff0c;…

苍穹外卖学习笔记(一)

文章目录 开发环境搭建一. 前端环境搭建二. 后端环境搭建1.进入idea项目2.提交git仓库(推送github远程仓库)3.数据库环境搭建4.前后端联调(在源代码中项目已经实现登录功能)nginx反向代理好处: 三. 完善登录功能(md5加密存储)1.首先打开pojo模块中实体类的employee&#xff0c;…