【白话树】之 二叉树

快速导航

  • 一、二叉树的基本概念
    • 1、 二叉树定义
    • 2、常见术语
    • 3、基本操作
      • 1)创建:
      • 2)插入与删除:
    • 4、常见类型
      • 1)满二叉树(完美二叉树)
      • 2)完全二叉树
      • 3)完满二叉树
      • 4)平衡二叉树
      • 5)链表 - 特殊的二叉树
  • 二、二叉树遍历
    • 1、层序遍历
    • 2、前序、中序、后序遍历

一、二叉树的基本概念

1、 二叉树定义

二叉树:是一种非线性数据结构,是“分而治之”思想的一种实现。

和链表一样,二叉树最基本的单位也是节点。

只是二叉树的节点,不仅包含值本身,也包含了左子节点和右子节点的引用。

二叉树(binary tree)是n(n≥0)个节点构成的集合,它或为空树(n=0)​,或满足以下两个条件:

1)有且仅有一个称为根的节点

2)除根节点以外,其余节点分为两个互不相交的子集T1和T2,分别称为T的左子树和右子树,且T1和T2本身都是二叉树

二叉树是一种特殊的树,它最多有两个子树,分别为左子树和右子树,二者是有序的,不可以互换。

也就是说,二叉树中不存在度大于2的节点。

下面是二叉树的五种形态:
在这里插入图片描述

Java结构代码:

/* 二叉树节点类 */
class TreeNode {int val;         // 节点值TreeNode left;   // 左子节点引用TreeNode right;  // 右子节点引用TreeNode(int x) { val = x; }
}

2、常见术语

  • 根节点:二叉树顶层的节点,唯一没有父节点的节点
  • 叶子节点:没有子节点的节点
  • 边:两个节点之间的连线
  • 节点所在的层:根节点层数为1,相当于根节点的层数 + 节点到根的边数
  • 节点的度子节点的数量
  • 二叉树的高度:根节点到所有叶子节点的最大的边数
  • 节点的深度根节点到节点的边数
  • 节点的高度节点到所有叶子节点的最大的边数
    在这里插入图片描述

3、基本操作

1)创建:

Java实现:

// 初始化节点
TreeNode n1 = new TreeNode(1);
TreeNode n2 = new TreeNode(2);
TreeNode n3 = new TreeNode(3);
TreeNode n4 = new TreeNode(4);
TreeNode n5 = new TreeNode(5);
// 构建节点之间的引用(指针)
n1.left = n2;
n1.right = n3;
n2.left = n4;
n2.right = n5;

2)插入与删除:

在这里插入图片描述
Java实现:

TreeNode P = new TreeNode(0);
// 在 n1 -> n2 中间插入节点 P
n1.left = P;
P.left = n2;
// 删除节点 P
n1.left = n2;

4、常见类型

1)满二叉树(完美二叉树)

所有层的节点都被填满的二叉树。
在这里插入图片描述

2)完全二叉树

只有最底层的节点没有被填满,而且同一层级是从左到右依次填充的。
在这里插入图片描述

3)完满二叉树

除了叶节点之外,其余所有节点都有两个子节点。
在这里插入图片描述

4)平衡二叉树

任意节点的左子树和右子树的高度之差的绝对值不超过 1 。
在这里插入图片描述

5)链表 - 特殊的二叉树

当二叉树中的每一层只有一个节点的时候,所有的节点组成一个链表。

二、二叉树遍历

1、层序遍历

相关概念: 广度优先遍历、广度优先搜索/BFS

遍历方式: 自顶向下,从左到右,逐层遍历

图示:
在这里插入图片描述
Java代码实现:

/* 层序遍历 */
List<Integer> levelOrder(TreeNode root) {// 初始化队列,加入根节点Queue<TreeNode> queue = new LinkedList<>();queue.add(root);// 初始化一个列表,用于保存遍历序列List<Integer> list = new ArrayList<>();while (!queue.isEmpty()) {TreeNode node = queue.poll(); // 队列出队list.add(node.val);           // 保存节点值if (node.left != null)queue.offer(node.left);   // 左子节点入队if (node.right != null)queue.offer(node.right);  // 右子节点入队}return list;
}

2、前序、中序、后序遍历

相关概念: 深度优先遍历、深度优先搜索/DFS

快速记忆: 先走到尽头,再回溯继续。

  • 前序(根节点 -> 左子树 -> 右子树)
  • 中序(左子树 -> 根节点 -> 右子树)
  • 后序(左子树 -> 右子树 -> 根节点)

图示:
在这里插入图片描述
深度优先遍历就像是绕着整棵二叉树的外围“走”一圈

深度优先搜索通常基于递归实现,Java代码如下:

/* 前序遍历 */
void preOrder(TreeNode root) {if (root == null)return;// 访问优先级:根节点 -> 左子树 -> 右子树list.add(root.val);preOrder(root.left);preOrder(root.right);
}/* 中序遍历 */
void inOrder(TreeNode root) {if (root == null)return;// 访问优先级:左子树 -> 根节点 -> 右子树inOrder(root.left);list.add(root.val);inOrder(root.right);
}/* 后序遍历 */
void postOrder(TreeNode root) {if (root == null)return;// 访问优先级:左子树 -> 右子树 -> 根节点postOrder(root.left);postOrder(root.right);list.add(root.val);
}

参考资料:

《趣学数据结构》 – 陈小玉
https://www.hello-algo.com/chapter_tree/binary_tree/#4

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

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

相关文章

支付宝开发者✖️「蚂小财」——AgentUniverse专业多智能体框架在严谨产业中的应用实践

正在直播&#xff1a;点击进入直播间互动拿蚂蚁保温杯 &#xfeff;直播&#xfeff; &#xfeff;

【Android Studio】使用雷电模拟器调试

文章目录 进入开发者模式使雷电模拟器adb连接PC 进入开发者模式 多次点击版本号 -开区USB调试 使雷电模拟器adb连接PC 写cmd脚本 雷电模拟器端口为5555 &#xff0c;脚本内容如下&#xff1a; adb.exe connect 127.0.0.1:5555默认使用powershell的建议为&#xff1a; .\a…

uniapp中使用picker-view选择时间

picker-view 是 UniApp 中用于展示和选择数据的组件。它适用于创建多列选择器&#xff0c;类似于 iOS 和 Android 系统中的选择器视图。以下是 picker-view 的详细介绍&#xff0c;包括用法、属性和事件。 一 用法 <template><view><picker-view :value"…

HarmonyOS使用LocationButton获取地理位置

LocationButton LocationKit getAddressesFromLocation方法 步骤&#xff1a; 整合 LocationButton并获取经纬度通过 LocationKit 将经纬度转为地址信息将地址信息渲染到页面上处理异常情况&#xff08;闪退&#xff09; LocationButton({ icon: LocationIconStyle.LINE…

Java lambda表达式的变量捕获

有人看到这个lambda表达式能够访问isQuit这个变量而且还是可以被修改的变量&#xff0c;就发出疑问了&#xff0c;之前不是说lambda不能不或变量吗&#xff1f; 1.规则 java的lambda表达式变量捕获规则只是针对于外部作用域的局部变量来说的&#xff01;&#xff01;&#xf…

LVGL 控件之仪表盘(lv_meter)

目录 一、概述二、仪表盘部件1、添加刻度2、添加指针3、设置仪表的角度和仪表的范围4、装饰4.1 仪表指针图片4.2 仪表的指示刻度4.3 仪表弧线指示器 5、API 函数 一、概述 仪表盘部件可以非常灵活地展示数据&#xff0c;其功能包括显示弧形&#xff08;arcs&#xff09;、指针…

linux_L1_linux重启服务器

使用putty登录到linux服务器切换到管理员账号 sudo -s重启命令 reboot

22 C 语言字符处理:分类判断与转换(ASCII 码、字母大小写)函数详解

目录 1 isdigit() 1.1 函数原型 1.2 功能说明 1.3 代码示例 2 isxdigit() 2.1 函数原型 2.2 功能说明 2.3 代码示例 3 islower() 3.1 函数原型 3.2 功能说明 3.3 代码示例 4 isupper() 4.1 函数原型 4.2 功能说明 4.3 代码示例 5 isalnum() 5.1 函数原型 5.…

手工刻制微带线测试驻波与阻抗特性

我这个电路板是1.38mm的。1oz铜厚&#xff0c;玻纤1.3mm的FR-4双面板. 通过SI9000计算出微带线的中心宽2.45-2.5mm。间隔为2mm。只想先做测试心里有数了再去打样制作板子来测试。 下面是用刻刀刻出的线&#xff0c;我先测试一下阻抗特性&#xff0c;后面拿来做一个简单的LC带通…

兔子检测系统源码分享

兔子检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

vue和thinkphp路由伪静态配置

vue路由伪静态配置&#xff1a; location / { try_files $uri $uri/ /index.html; } thinkphp 路由伪静态配置 location ~* (runtime|application)/{ return 403; } location / { if (!-e $request_filename){ rewrite ^(.*)$ /index.php?s$1 last; break; } }

【Java 学习】:抽象类接口

✨ 人逢喜事精神爽&#xff0c;月到中秋分外明 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;java学习 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f4…

【代码】使用c#实现串口通信的基础模板

一、分享代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;using System.IO.Ports; using…

【环境问题】清除僵尸进程 | 深度学习任务中止但是GPU仍在占用

我一般遇到这种是本地网络意外中断了&#xff0c;程序不见了&#xff0c;但是GPU仍在占用。 1.确认GPU显存&#xff1a; 终端输入 nvidia-smi 查看显存使用情况&#xff1a; 2.查看所有进程&#xff1a; 输入fuser -v /dev/nvidia* 查看进程。如果出现bash: fuser: command no…

数据结构——链表(短小精悍版)

使用链表结构可以克服数组链表需要预先知道数据大小的缺点 链表结构可以充分利用计算机内存空间&#xff0c;实现灵活的内存动态管理。 但是链表失去了数组随机读取的优点&#xff0c;同时链表由于增加了结点的指针域&#xff0c;空间开销比较大。 单向链表&#xff1a; 一个…

【kafka】生产者

1. 主要参数&#xff1a; **bootstrap.servers&#xff1a;**该参数用来指定生产者客户端连接Kafka集群所需的broker地址清单&#xff0c;具体的内容格式为host1&#xff1a;port1&#xff0c;host2&#xff1a;port2&#xff0c;可以设置一个或多个地址&#xff0c;中间以逗号…

《Google软件测试之道》笔记

介绍 GTAC&#xff1a;Google Test Automation Conference&#xff0c;Google测试自动化大会。 本书出版之前还有一本《微软测试之道》&#xff0c;值得阅读。 质量不是被测试出来的&#xff0c;但未经测试也不可能开发出有质量的软件。质量是开发过程的问题&#xff0c;而不…

ROS第五梯:ROS+VSCode+C++单步调试

解决问题&#xff1a;在ROS项目中进行断点调试。 第一步&#xff1a;创建一个ROS项目或者打开一个现有的ROS项目。 第二步&#xff1a;修改c_cpp_properties.json 增加一段命令: "compileCommands": "${workspaceFolder}/build/compile_commands.json"第三…

线结构光测量系统标定--导轨

光平面标定原理可查看之前的博文《光平面标定》&#xff0c;光条中心提取可参考线结构光专栏光条中心提取系列的文章&#xff0c;相机标定参考相机标定专栏中的博文。&#xff08;欢迎进Q群交流&#xff1a;874653199&#xff09; 线结构光测量系统(指一个线结构光传感器与一个…

rocky9虚拟机配置双网卡的详细过程

编辑虚拟机配置->添加->选择网络适配器->确认->打开虚拟机 1.ip add查看第二个网卡的名称&#xff0c;我这里是ens36 2.cd到网卡的配置文件目录 cd /etc/NetworkManager/system-connections/ ls3.复制一份网卡的配置文件并改名为ens36.nmconnection(根据自己的第…