【白话树】之 二叉树

news2024/9/22 7:28:11

快速导航

  • 一、二叉树的基本概念
    • 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.coloradmin.cn/o/2139107.html

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

相关文章

Mysql InnoDB 存储引擎简介

InnoDB 存储引擎是 Mysql 的默认存储引擎&#xff0c;它是由 Innobase Oy 公司开发的 Mysql 为什么默认使用 InnoDB 存储引擎 InnoDB 是一款兼顾高可靠性和高性能的通用存储引擎 在 Mysql 5.5 版本之前&#xff0c;默认是使用 MyISAM 存储引擎&#xff0c;在 5.5 及其之后版…

WEB打点

目录 web打点概述打点流程打点中的问题getshell手法汇总web打点批量检测端口扫描POC扫描指纹识别漏洞扫描 手工检测开源框架漏洞通用框架漏洞基础web漏洞商用系统漏洞 WAF绕过waf分类常见waf拦截界面WAF绕过思路侧面绕&#xff1a;适合云WAF直面WAF web打点概述 打点流程 资产…

远程Linux网络连接( Linux 网络操作系统 04)

接下来我们准备开始进入Linux操作系统的第二个模块的学习&#xff0c;不过在学习之前我们需要对如下进行简单的配置&#xff0c;通过外接辅助软件MobaXterm来进行虚拟操作系统的访问。接下来的课程我们会一直在MobaXterm中进行命令和相关知识的学习。 一、准备阶段 1.1 软件 …

安装配置filebrowser

安装配置filebrowser ​ 这章就简单搞个工具用一下&#xff0c;这个工具就是一个像安卓软件一样的文件浏览器&#xff0c;可以设置用户权限啥的&#xff0c;挺好用的下面直接粘的安装步骤&#xff0c;注意一下配置别错了就行&#xff0c;json文件和命令配置要一样。访问效果放…

逻辑回归原理

本文主要介绍了逻辑回归的原理和应用&#xff0c;包括从线性回归到逻辑回归的转换、二元逻辑回归的模型和损失函数、优化方法以及正则化等内容。以下是内容的详细叙述&#xff1a; 1. 从线性回归到逻辑回归 线性回归模型&#xff1a;线性回归是找出输出特征向量Y与输入样本矩阵…

无线通信感知/雷达系统算法专业技术栈

无论是在工业界还是在学业界&#xff0c;无线通信感知一体化都是一个热门的方向&#xff0c;作为一个24届毕业生&#xff0c;刚好处于行业当中&#xff0c;就总结一下自己浅薄认知下&#xff0c;自己觉得已经掌握或者应该掌握的技术栈和专业能力&#xff0c;与大家共勉。 Rada…

CS61C 2020计算机组成原理Lab01-数字表示,溢出

1. Exercise 1 :See what you can C # 用gcc 来编译可执行文件如program.c gcc program.c # 就可以得到一个executable file named a.out. ./a.out# 如果想给这个可执行文件命名&#xff0c;则使用 -o gcc -o program program.c ./program# 使用-g 能得到一个 可执行程序的deb…

微服务保护之熔断降级

在微服务架构中&#xff0c;服务之间的调用是通过网络进行的&#xff0c;网络的不确定性和依赖服务的不可控性&#xff0c;可能导致某个服务出现异常或性能问题&#xff0c;进而引发整个系统的故障&#xff0c;这被称为 微服务雪崩。为了防止这种情况发生&#xff0c;常用的一些…

K8s 之控制器的定义及详细调用案例

什么是控制器 官方文档&#xff1a; https://v1-30.docs.kubernetes.io/zh-cn/docs/concepts/workloads/controllers/ 控制器也是管理pod的一种手段 自主式pod&#xff1a;pod退出或意外关闭后不会被重新创建控制器管理的 Pod&#xff1a;在控制器的生命周期里&#xff0c;始…

《深度学习》PyTorch 手写数字识别 案例解析及实现 <下>

目录 一、回顾神经网络框架 1、单层神经网络 2、多层神经网络 二、手写数字识别 1、续接上节课代码&#xff0c;如下所示 2、建立神经网络模型 输出结果&#xff1a; 3、设置训练集 4、设置测试集 5、创建损失函数、优化器 参数解析&#xff1a; 1&#xff09;para…

Cesium 计算3d凸包(ConvexHull)

Cesium 计算3d凸包(ConvexHull) Cesium 计算3d凸包(ConvexHull)

Unity实战案例全解析:PVZ 植物放置分析

前篇&#xff1a;Unity实战案例全解析&#xff1a;PVZ 植物卡片状态分析-CSDN博客 植物应该如何从卡牌状态转为实物&#xff1f; 其实就只需要考虑两个步骤加一个后续处理&#xff1a; 1.点击卡牌后就实例化 需要一个植物状态枚举&#xff0c;因为卡牌分为拿在手上和种植下…

Android 10.0 mtk平板camera2横屏预览旋转90度横屏保存圆形预览缩略图旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,点击录像和照片下保存的圆形预览缩略图 依然是竖屏的,所以说同样需要…

需求导向的正则表达式

目录 re.sub 需求&#xff1a;把 1. 2.这些序号转成&#xff08;1&#xff09; &#xff08;2&#xff09; 需求&#xff1a;反过来&#xff0c;把(1)->1. ,&#xff08;2&#xff09;》2. 。 需求&#xff1a;把出现的 1 2 3都转成下标 进阶1&#xff01;只想让化学符…

Redis入门2

在java中操作Redis Redis的Java客户端 Redis 的 Java 客户端很多&#xff0c;常用的几种: Jedis Lettuce Spring Data Redis Spring Data Redis 是 Spring 的一部分&#xff0c;对 Redis 底层开发包进行了高度封装。 在 Spring 项目中&#xff0c;可以使用Spring Data R…

把项目部署到Linux系统上(如何在阿里云服务器上安装和配置SpringBoot+vue全栈开发环境)

项目部署上线 环境准备下载安装Linux系统和ssh连接工具背景知识安装虚拟机安装Linux系统选择installCentOS7按命令IP addr查看服务器IP地址&#xff0c;ens33网卡中会出现IP地址配置好后就可以查看了一个可远程连接Linux服务器的工具1.&#xff08;基于finalshell工具&#xff…

小明震惊OpenAI 的新模型 01

在硅谷的中心&#xff0c;繁忙的咖啡馆和创业中心周围&#xff0c;年轻的软件工程师小明坐在他的办公桌前&#xff0c;面露困惑。科技界一直在盛传一项新的AI突破&#xff0c;但他持怀疑态度&#xff0c;不敢抱太大希望。他认为AI泡沫即将破灭&#xff0c;炒作列车即将出轨&…

网络原理 IP协议与以太网协议

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 JavaEE专栏:JavaEE 关注博主带你了解更多数据结构知识 目录 1.网络层 IP协议 1.IP协议格式 2.地址管理 2.1 IP地址 2.2 解决IP地址不够用的问题 2.3NAT网络地址转换 2.4网段划分 3.路由选择…

北极星计划的回响:从Leap Motion到Midjourney的AI 3D硬件梦想

在科技的浩瀚星空中,总有一些梦想如同北极星般璀璨,指引着探索者前行。六年前,Leap Motion的CEO David以一篇充满激情的博客文章,向我们揭示了“北极星计划”——一个旨在打破数字与物理界限,创造流畅统一体验的增强现实平台。今天,随着Midjourney在AI文生图领域的全球爆…

2024.9.15周报

一、题目信息 题目&#xff1a;Physics-informed neural networks for solving flow problems modeled by the 2D Shallow Water Equations without labeled data 链接&#xff1a;物理信息神经网络用于解决由二维浅水方程建模的流动问题&#xff0c;无需标记数据- ScienceDi…