Hello算法7:二叉树

news/2024/4/29 14:07:07/文章来源:https://blog.csdn.net/kayotin/article/details/137119770

Hello算法7:二叉树

https://www.hello-algo.com/chapter_tree/binary_tree/

基本介绍

二叉树是一种非线性数据结构,代表祖先和后辈的关系,体现了分治思想。

二叉树的基本单元节点,包含值,左节点和右节点的引用

class TreeNode:"""二叉树节点类"""def __init__(self, val: int):self.val: int = val                   # 节点值self.left: Optional[TreeNode] = None  # 左子节点引用self.right: Optional[TreeNode] = None # 右子节点引用

常见定义

  • 根节点-root node-位于顶部的节点,没有父节点
  • 叶节点-leaf node-位于底部的节点,没有子节点
  • 边-dege-连接两个节点的线段,也就是指针
  • 节点所在的层-level-,根节点的层是1,从顶至底递增
  • 节点的度-degree-节点的子节点的数量。有0,1,2个子节点
  • 二叉树的高度:从根节点到最远叶节点所经过的边的数量
  • 节点的深度:从根节点到该节点,所经过的边的数量
  • 节点的高度:从最远叶节点到该节点,所经过的边的数量

初始化二叉树

# 初始化二叉树
# 初始化节点
n1 = TreeNode(val=1)
n2 = TreeNode(val=2)
n3 = TreeNode(val=3)
n4 = TreeNode(val=4)
n5 = TreeNode(val=5)
# 构建引用,即指针
n1.left = n2
n1.right = n3
n2.left = n4
n2.right = n5

插入或删除节点

# 插入与删除节点
p = TreeNode(0)
# 在 n1 -> n2 中间插入节点 P
n1.left = p
p.left = n2
# 删除节点 P
n1.left = n2

常见二叉树

  1. 完美二叉树 perfect

    所有节点的度都是2,也就是所有节点都有2个子节点的二叉树。完美反映细胞分裂。

  2. 完全二叉树 complet

    只有最底层节点未填满,且节点靠左填充

  3. 完满二叉树 full

    除了叶节点之外,所有节点都有2个子节点

  4. 平衡二叉树 balanced

    任意节点的左子树和右子树的高度差,绝对值不超过1

层序遍历

从顶部到底部,逐层,从左到右进行遍历

# 层序遍历
def level_order(root: TreeNode | None) -> list[int]:queue = deque()queue.append(root)res = []while queue:node: TreeNode = queue.popleft()res.append(node.val)if node.left is not None:queue.append(node.left)if node.right is not None:queue.append(node.right)return res

前序遍历

def pre_order(root: TreeNode | None):if root is None:returnres.append(root.val)pre_order(root=root.left)pre_order(root=root.right)

二叉树数组表示

先分析一种简单的情况,完美二叉树,左节点是2i+1,右节点是2i+2,这时候可以很方便的用数组表示;

再扩展到任意二叉树,用none表示和填充数组即可;

完全二叉树,none只在最底层并且靠右,很适合用数组表示;

代码如下:

数组表示的优点:

  • 数组存储在连续的内存空间,对缓存友好
  • 不需要指针,节省空间
  • 允许随机访问节点

数组表示的缺点:

由于需要连续内存空间,不适合存储过大的树

增删节点需要通过数组的插入和删除来实现,效率较低

当二叉树中存在大量None时,空间利用率较低

二叉搜索树

定义:

  • 对于根节点,左子树中所有节点的值<根节点的值<右子树中所有节点的值
  • 任意子树,同样满足上一个条件

搜索操作:

def search(self, num: int) -> TreeNode | None:"""查找节点"""cur = self._root# 循环查找,越过叶节点后跳出while cur is not None:# 目标节点在 cur 的右子树中if cur.val < num:cur = cur.right# 目标节点在 cur 的左子树中elif cur.val > num:cur = cur.left# 找到目标节点,跳出循环else:breakreturn cur

插入操作:

为了保证插入元素后依然满足二叉搜索树的性质,插入步骤如下

  1. 查找插入位置,类似于搜索操作
  2. 在该位置插入节点
def insert(self, num: int):"""插入节点"""# 若树为空,则初始化根节点,也就是直接插在根节点if self._root is None:self._root = TreeNode(num)return# 循环插找cur, pre = self._root, Nonewhile cur is not None:# 找到重复值,直接returnif cur.val == num:returnpre = curif cur.val < num:cur = cur.rightelse:cur = cur.left# 插入节点node = TreeNode(num)if pre.val < num:pre.right = nodeelse:pre.left = node

删除操作:

查找到要删除的节点后,删除分为三种情况

是叶节点,直接删除即可

有1个子节点,用子节点替换该节点

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

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

相关文章

电脑如何更新AMD独立显卡驱动?安装官方驱动的方法来了!

前言 有小伙伴在电脑上安装了独立显卡之后&#xff0c;总会用驱动人生或者驱动精灵等软件给独立显卡安装驱动。这种安装方法并不能说是错的&#xff0c;反正能用就行。 安装官方驱动的办法其实很简单&#xff0c;现在独立显卡一共就那么几家&#xff0c;最常见的显卡就是Nvidi…

Java基于微信小程序的校园订餐小程序的实现,附源码和数据库

博主介绍&#xff1a;✌Java徐师兄、7年大厂程序员经历。全网粉丝13w、csdn博客专家、掘金/华为云等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 3月29日,星期五

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年3月29日 星期五 农历二月二十 1、 网络表演&#xff08;直播与短视频&#xff09;运营团体标准发布&#xff1a;应建立举报处置机制。 2、 商务部&#xff1a;中国决定终止对澳大利亚进口葡萄酒征收反倾销税和反补贴税。…

八大技术趋势案例(虚拟现实增强现实)

科技巨变,未来已来,八大技术趋势引领数字化时代。信息技术的迅猛发展,深刻改变了我们的生活、工作和生产方式。人工智能、物联网、云计算、大数据、虚拟现实、增强现实、区块链、量子计算等新兴技术在各行各业得到广泛应用,为各个领域带来了新的活力和变革。 为了更好地了解…

android中控件和基本事件的响应

1.概述 在Android中&#xff0c;在处理UI中的各种元素的时候&#xff0c;两个程序中的要点为&#xff1a; 得到布局文件&#xff08;XML&#xff09;中的控件句柄 设置控件的行为 本篇文章将介绍在 Android 中几种基本的程序控制方法&#xff0c;要获得的效果是通过 2 个按钮来…

吴恩达机器学习:实践实验室-应用机器学习的建议(Advice for Applying )

在这个实验室中&#xff0c;您将探索评估和改进机器学习模型的技术。 文章目录 1 - Packages2-评估学习算法&#xff08;多项式回归&#xff09;2.1拆分数据集2.1.1图列、测试集 2.2模型评估的误差计算&#xff0c;线性回归2.3比较训练和测试数据的表现 3-偏差和方差3.1绘图列…

鸿蒙OpenHarmony技术:【设备互信认证】

简介 在OpenHarmony中&#xff0c;设备互信认证模块作为安全子系统的子模块&#xff0c;负责设备间可信关系的建立、维护、使用、撤销等全生命周期的管理&#xff0c;实现可信设备间的互信认证和安全会话密钥协商&#xff0c;是搭载OpenHarmony的设备进行可信互联的基础平台能…

R语言批量计算t检验,输出pvalue和均值

1.输入数据如下&#xff1a; 2.代码如下 setwd("E:/R/Rscripts/rG4相关绘图") # 读取CSV文件 data <- read.csv("box-cds-ABD-不同类型rg4-2.csv", stringsAsFactors FALSE)# 筛选出Type2列为指定五种类型的数据 filtered_data <- subset(data, …

一篇文章,告别Flutter状态管理争论,问题和解决

起因 每隔一段时间&#xff0c;都会出现一个新的状态管理框架&#xff0c;最近在YouTube上也发现了有人在推signals, 一个起源于React的状态管理框架&#xff0c;人们总是乐此不疲的发明各种好用或者为了解决特定问题而产生的方案&#xff0c;比如Bloc, 工具会推陈出新&#x…

春秋云境CVE-2023-0562

简介 银行储物柜管理系统是一个基于网络的应用程序&#xff0c;用于处理存储银行客户贵重物品的银行储物柜。储物柜的所有详细信息都保存在数据库中。银行储物柜管理系统项目是使用 PHP 和 MySQLi 扩展开发的。 正文 进入靶场&#xff0c;首先就看到有个bankers&#xff0c;…

Java安全篇-Fastjson漏洞

前言知识&#xff1a; 一、json 概念&#xff1a; json全称是JavaScript object notation。即JavaScript对象标记法&#xff0c;使用键值对进行信息的存储。 格式&#xff1a; {"name":"wenda","age":21,} 作用&#xff1a; JSON 可以作为…

【Redis】redis哨兵模式

概述 Redis Sentinel&#xff0c;即Redis哨兵&#xff0c;在Redis 2.8版本开始引入。它是Redis高可用的实现方案之一。Sentinel是一个管理多个Redis实例的工具&#xff0c;它的核心功能是可以实现对Redis的监控、通知、自动故障转移。 监控&#xff08;Monitoring&#xff09…

OSX-02-Mac OS应用开发系列课程大纲和章节内容设计

本节笔者会详细介绍下本系统专题的大纲&#xff0c;以及每个专题章节的组织结构。这样读者会有一个全局的概念。 在开始前还是在再介绍一下下面这个框架图&#xff0c;因为比较重要&#xff0c;在这里再冗余介绍一下。开发Apple公司相关产品的软件时&#xff0c;主要有两个框架…

Untiy 布局控制器Aspect Ratio Fitter

Aspect Ratio Fitter是Unity中的一种布局控制器组件&#xff0c;用于根据指定的宽高比来调整包含它的UI元素的大小。实际开发中&#xff0c;它可以确保UI元素保持特定的宽高比&#xff0c;无论UI元素的内容或父容器的大小如何变化。 如图为Aspect Ratio Fitter组件的基本属性&…

深度学习 - PyTorch基本流程 (代码)

直接上代码 import torch import matplotlib.pyplot as plt from torch import nn# 创建data print("**** Create Data ****") weight 0.3 bias 0.9 X torch.arange(0,1,0.01).unsqueeze(dim 1) y weight * X bias print(f"Number of X samples: {len(…

Day24:私信列表、私信详情、发送私信

测试用户&#xff1a;用户名aaa 密码aaa 查询当前用户的会话列表&#xff1b;每个会话只显示一条最新的私信&#xff1b;支持分页显示。 首先看下表结构&#xff1a; conversation_id: 用from_id和to_id拼接&#xff0c;小的放前面去&#xff08;因为两个人的对话应该在一个会…

物联网实战--入门篇之(一)物联网概述

目录 一、前言 二、知识梳理 三、项目体验 四、项目分解 一、前言 近几年很多学校开设了物联网专业&#xff0c;但是确却地讲&#xff0c;物联网属于一个领域&#xff0c;包含了很多的专业或者说技能树&#xff0c;例如计算机、电子设计、传感器、单片机、网…

誉天华为认证云计算课程如何

HCIA-Cloud Computing 5.0 课程介绍&#xff1a;掌握华为企业级虚拟化、桌面云部署&#xff0c;具备企业一线部署实施及运维能力 掌握虚拟化技术、网络基础、存储基础等内容&#xff0c;拥有项目实施综合能力 满足企业虚拟化方案转型需求&#xff0c;应对企业日益多样的业务诉求…

快速上手Spring Cloud 十四:璀璨物联网之路

快速上手Spring Cloud 一&#xff1a;Spring Cloud 简介 快速上手Spring Cloud 二&#xff1a;核心组件解析 快速上手Spring Cloud 三&#xff1a;API网关深入探索与实战应用 快速上手Spring Cloud 四&#xff1a;微服务治理与安全 快速上手Spring Cloud 五&#xff1a;Spring …

JAVA面试八股文之集合

JAVA集合相关 集合&#xff1f;说一说Java提供的常见集合&#xff1f;hashmap的key可以为null嘛&#xff1f;hashMap线程是否安全, 如果不安全, 如何解决&#xff1f;HashSet和TreeSet&#xff1f;ArrayList底层是如何实现的&#xff1f;ArrayList listnew ArrayList(10)中的li…