代码随想录算法跟练 | Day14 | 二叉树 Part01

个人博客主页:http://myblog.nxx.nx.cn
代码GitHub地址:https://github.com/nx-xn2002/Data_Structure.git

Day14

今天,主要是二叉树的基础知识,包括二叉树的结构、存储方式和遍历方式

二叉树的结构

二叉树顾名思义,就是由一个或多个节点组成的树形结构,树形结构中起始的节点被称为根节点,而二叉则表示每个节点有两个子节点,通常将一个节点的左右节点为根节点构成的树称为这个节点的左子树和右子树,如果一个节点的左子树和右子树都为空,它被称为二叉树的叶子结点。

二叉树的存储方式

链式存储

这是我们平时最常见的二叉树的存储方式,每个节点上存储了当前节点的值,还有左右指针分别指向左右子树的根节点的地址。

class TreeNode{int data;TreeNode left;TreeNode right;
}

顺序存储

如果父节点的数组下标是 i,那么它的左孩子就是 i * 2 + 1,右孩子就是 i * 2 + 2,按这样的规律进行存储,结果类似二叉树的层序遍历

二叉树的遍历方式

二叉树主要有两种遍历方式:

  1. 深度优先遍历:优先向深处走,遍历到一条路径的叶子结点后,再遍历其他路径
  2. 广度优先遍历:按照深度划分层次,按层次逐渐向下遍历

深度优先遍历

深度优先遍历按照遍历当前节点的先后次序,分为了三种:

  • 前序遍历(中 -> 左 -> 右)
  • 中序遍历(左 -> 中 -> 右)
  • 后序遍历(左 -> 右 -> 中)

我们可以很容易地使用递归来实现这几种遍历方式:

/**
* 前序遍历
*/
public void traversal1(TreeNode root){if(root == null){return;}System.out.println(root.data);traversal(root.left);traversal(root.right);
}/**
* 中序遍历
*/
public void traversal2(TreeNode root){if(root == null){return;}traversal(root.left);System.out.println(root.data);traversal(root.right);
}/**
* 后序遍历
*/
public void traversal3(TreeNode root){if(root == null){return;}traversal(root.left);traversal(root.right);System.out.println(root.data);
}

而相对应的,递归可以通过栈加循环的方式转换为迭代,迭代法如下所示:

/**
* 前序遍历
*/
public List<Integer> traversal1(TreeNode root){List<Integer> res = new ArrayList<>();if(root == null){return res;}Stack<TreeNode> stack = new Stack<>();stack.push(root);while(!stack.isEmpty()){//中TreeNode temp = stack.peek();stack.pop();res.add(temp.data);//右if(temp.right != null){stack.push(temp.right);}//左if(temp.left != null){stack.push(temp.left);}}return res;
}/**
* 中序遍历
*/
public List<Integer> traversal2(TreeNode root){List<Integer> res = new ArrayList<>();if(root == null){return res;}Stack<TreeNode> stack = new Stack<>();stack.push(root);TreeNode cur = root;while (cur != null || !stack.isEmpty()){if (cur != null){stack.push(cur);cur = cur.left;}else{cur = stack.pop();res.add(cur.data);cur = cur.right;}}return res;
}/**
* 后序遍历
*/
public List<Integer> traversal3(TreeNode root){List<Integer> res = new ArrayList<>();if(root == null){return res;}Stack<TreeNode> stack = new Stack<>();stack.push(root);while(!stack.isEmpty()){//中TreeNode temp = stack.peek();stack.pop();res.add(temp.data);//左if(temp.left != null){stack.push(temp.left);}//右if(temp.right != null){stack.push(temp.right);}}Collections.reverse(res);return res;
}

广度优先遍历

广度优先遍历在树形结构中也称为层序遍历,实现思路也比较简单,只需要使用一个队列来进行辅助,先将某一层的所有节点放到队列中,队首出队操作即为对队首元素指向的节点进行遍历,同时依次将队首的非空左右指针入队,这样当某一层元素遍历完毕后,也完成了对下一层所有元素的入队操作。

代码实现:

public List<List<Integer>> traversal(TreeNode node) {List<List<Integer>> res = new ArrayList<>();if(node == null){return res;}Queue<TreeNode> queue = new LinkedList<TreeNode>();queue.offer(node);while (!queue.isEmpty()) {List<Integer> itemList = new ArrayList<Integer>();int len = queue.size();while (len > 0) {TreeNode tmpNode = queue.poll();itemList.add(tmpNode.data);if (tmpNode.left != null){que.offer(tmpNode.left);}if (tmpNode.right != null){que.offer(tmpNode.right);}len--;}res.add(new ArrayList<>(itemList));}
}

总结:
今天学习了二叉树相关的基础知识,需要在以后进行灵活应用

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

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

相关文章

注意力机制在大语言模型中的应用

在大语言模型中&#xff0c;注意力机制&#xff08;Attention Mechanism&#xff09;用于捕获输入序列中不同标记&#xff08;token&#xff09;之间的关系和依赖性。这种机制可以动态地调整每个标记对当前处理任务的重要性&#xff0c;从而提高模型的性能。具体来说&#xff0…

LSTM 简单的案例

后期总结&#xff1a; 参考&#xff1a; [1] 基于 PyTorch LSTM 进行时间序列预测 [2] https://zhuanlan.zhihu.com/p/685266225

Kubernetes之 资源管理

系列文章目录 Kubernetes之 资源管理 文章目录 系列文章目录前言一、资源管理介绍二、YAML语言介绍 1.1.YAML语法&#xff1a;2.读入数据总结 一、资源管理介绍 在kubernetes中&#xff0c;所有的内容都抽象为资源&#xff0c;用户需要通过操作资源来管理kubernetes。 1. kub…

SQL注入和防御方法

SQL注入是一种攻击手段&#xff0c;通过在SQL查询中插入恶意SQL代码片段&#xff0c;欺骗数据库服务器执行非授权的数据库操作。这种攻击可能导致数据泄露、篡改或丢失。为了防范SQL注入&#xff0c;可以采取以下几种策略&#xff1a; 1.使用预编译语句&#xff08;Prepared St…

Golang | Leetcode Golang题解之第201题数字范围按位与

题目&#xff1a; 题解&#xff1a; func rangeBitwiseAnd(m int, n int) int {for m < n {n & (n - 1)}return n }

图片与PDF文件相互转换

图片与PDF文件相互转换 一、概述二、提取PDF文件中的图片2.1代码实现2.2注意要点2.2.1代码使用2.2.2依赖包2.2.3图片序号设置 三、图片转换为PDF文件3.1代码实现3.2注意要点3.2.1代码使用3.2.2PDF文件尺寸设置3.2.3PDF文件中图片尺寸计算 一、概述 本文实现了提取PDF文件中包含…

threadX netx 设置IP地址以及获取IP地址

ThreadX 是一个实时操作系统&#xff08;RTOS&#xff09;内核&#xff0c;而 NetX 则是 Express Logic 提供的一个嵌入式 TCP/IP 网络栈&#xff0c;它经常与 ThreadX 一起使用来提供网络功能。在 ThreadX 和 NetX 中设置和获取 IP 地址通常涉及几个步骤。 设置 IP 地址 初始…

怎么打印加密的Excel文件,有哪些方法?

很多小伙伴都喜欢使用Excel来创建或是编辑表格文档&#xff0c;因为Excel中的功能十分的丰富且强大&#xff0c;在Excel中我们可以对表格文档进行各种操作。有的小伙伴可能在打印时需要给每一页表格添加页码&#xff0c;但又不知道该在哪里找到相关操作&#xff0c;其实很简单&…

视频编解码从H.264到H.266:浅析GB28181安防视频汇聚EasyCVR视频压缩技术

随着信息技术的飞速发展&#xff0c;视频编解码技术也在不断革新&#xff0c;以适应高清、超高清甚至8K视频时代的到来。视频编解码技术作为数字多媒体领域的核心技术之一&#xff0c;也在不断地演进和革新。从早期的H.261到现在的H.265、H.266&#xff0c;每一次技术的升级都极…

electron线上更新

一、安装electron-updater npm install --save electron-updater二、在main.js中引入使用 import { autoUpdater } from electron; if (!isDev) {const serverUrl https://your-update-server.com; // 自定义更新服务器地址或GitHub Releases地址autoUpdater.setFeedURL(${…

GPT-5:编织未来智能的经纬

GPT-5技术突破预测 随着GPT-5的预告&#xff0c;人工智能的叙事正步入一个崭新的篇章。想象中的GPT-5不仅是自然语言处理&#xff08;NLP&#xff09;领域的革命&#xff0c;更是对“理解”本身的一次重新定义。它可能集成深度学习的最新进展&#xff0c;如自注意力机制的进一步…

Java将list数组中重复的对象进行去重

/*** 数组去重*/ public class ArrayDistinct {public static void main(String[] args) {ArrayList<Object> list new ArrayList<>();JSONObject jsonObject1 new JSONObject();jsonObject1.put("name","张三");jsonObject1.put("age&…

使用systemd管理Linux下的frps服务:安装、配置及自动化操作指南

在 Linux 系统下&#xff0c;使用 systemd 可以方便地控制 frps 服务端的启动、停止、配置后台运行以及开机自启动。以下是具体的操作步骤&#xff1a; 1. 安装 systemd 如果您的 Linux 服务器上尚未安装 systemd&#xff0c;可以使用包管理器如 yum&#xff08;适用于 Cent…

Python 斐波那契的几种实现方式

斐波那契数列是一个经典的数列&#xff0c;其中每个数字是前两个数字的和。数列开始于 0 和 1&#xff0c;即 0, 1, 1, 2, 3, 5, 8, 13, ...。在 Python 中&#xff0c;你可以使用多种方法来生成斐波那契数列。以下是几种常见的方法&#xff1a; 方法一&#xff1a;递归 递归…

Spring系统学习 - 基于注解管理Bean

什么是基于注解的方式管理Bean 在 Spring 框架中&#xff0c;基于注解的方式管理 Bean 是一种非常流行且现代的方法。它允许你通过在类、方法或字段上添加特定的注解来声明 Bean 的创建和依赖注入&#xff0c;从而避免了在 XML 配置文件中定义 Bean 的繁琐工作。 注解和 XML …

码农:如何快速融入团队

问题&#xff1a; 码农如何快速融入团队&#xff1f; 记住一个标准&#xff1a;能干事、能抗事。 总结一个字&#xff1a; 靠谱。 适用范围&#xff1a;新手码农、老司机码农、测试、DBA、运维、产品经理、项目经理、架构师、技术专家、。。。。适用于任何行业的打工者。 下面要…

电脑开机就一直在开机界面转圈,怎么回事?

前言 前段时间小白去给一位朋友修电脑。她说这个电脑很奇怪&#xff0c;有时候开机很快就进入电脑界面&#xff0c;但有时候开机一直在那转圈&#xff0c;半天也不见进入。 Windows7系统的小伙伴应该也有遇到过类似的问题&#xff0c;就是电脑一直在Windows的logo界面&#xf…

自动驾驶水泥搅拌车在梁场的应用(上)

北京渡众机器人科技有限公司的自动驾驶水泥搅拌车在梁场的应用可以极大地提升生产效率和安全性。通常情况下&#xff0c;梁场是用于预制混凝土梁的生产和装配的场地&#xff0c;传统上需要大量的人工操作和搅拌车的驾驶。引入自动驾驶技术可以带来以下几个显著的优势&#xff1…

AI进阶指南第五课,大模型相关概念(知识库,微调)

虽然前面大概讲了一下大模型的一些基本概念&#xff0c;但是那些都比较偏向于大模型本身&#xff0c;但是我们使用的时候如果只靠大模型肯定是不行的。 就好比如果一个人只有一个脑子&#xff0c;其他什么部位也没有的话&#xff0c;那场面。&#xff08;感觉现在网上的AI图片…

Java OA系统招聘管理模块

### 使用Spring Boot和MySQL构建一个完善的OA招聘管理系统 在企业的日常运作中&#xff0c;招聘管理系统是一个重要的组成部分。本文将介绍如何使用Spring Boot和MySQL构建一个完整的OA招聘管理模块。这个模块包含以下主要功能&#xff1a; 1. **岗位管理**&#xff1a;对岗位…