[数据结构与算法]-什么是二叉树?

在这里插入图片描述

二叉树是一种数据结构,由节点组成,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的每个节点包含一个值,并且左子节点的值小于等于父节点的值,右子节点的值大于等于父节点的值。这个性质使得二叉树在搜索、排序、解析表达式等方面有着广泛的应用。

二叉树(binary tree)是一种非线性数据结构,代表“祖先”与“后代”之间的派生关系,体现了“一分为二”的分治逻辑。与链表类似,二叉树的基本单元是节点,每个节点包含值、左子节点引用和右子节点引用。

二叉树的基本概念:

  • 根节点(Root):树的顶端节点,没有父节点的节点。
  • 节点(Node):树中的一个元素,包含一个值和指向其子节点的指针。
  • 父节点(Parent):一个节点的直接上级,即指向该节点的节点。
  • 子节点(Children):一个节点的直接下级,即由该节点指向的节点。
  • 叶子节点(Leaf):没有子节点的节点,即位于树末端的节点。
  • 深度(Depth):节点所在的层次,根节点的深度为0,依次递增。
  • 高度(Height):树中任意节点到叶子节点的最长路径的长度,即树的最大深度。
  • 子树(Subtree):树中的一部分,由一个节点及其所有后代节点组成。

常见二叉树类型

常见的二叉树类型包括:

  1. 二叉搜索树(Binary Search Tree,BST):一种有序的二叉树,其中每个节点的左子树中的值都小于该节点的值,右子树中的值都大于该节点的值。这种特性使得在 BST 中进行搜索、插入和删除操作的平均时间复杂度为 O(log n)。
  2. 平衡二叉树(Balanced Binary Tree):一种高效的二叉树,它的任意节点的左右子树的高度差不超过 1。常见的平衡二叉树包括 AVL 树、红黑树等。平衡二叉树可以保持树的高度始终在较小的范围内,从而保证了常数时间复杂度的搜索、插入和删除操作。
  3. 满二叉树(Full Binary Tree):每个节点要么是叶子节点,要么有两个子节点。即除了叶子节点外,每个节点都有两个子节点。满二叉树的节点数为 2^h - 1,其中 h 为树的高度。
  4. 完全二叉树(Complete Binary Tree):除了最后一层外,所有层都被完全填充,并且最后一层从左到右填充。完全二叉树通常用数组来表示,具有一些特殊的性质,例如在数组中第 i 个位置的节点的左子节点位于 2i+1 处,右子节点位于 2i+2 处。
  5. 二叉堆(Binary Heap):一种特殊的完全二叉树,分为最大堆和最小堆。在最大堆中,父节点的值大于或等于任何一个子节点的值;在最小堆中,父节点的值小于或等于任何一个子节点的值。二叉堆通常用于实现优先队列等数据结构。

二叉树的遍历方式:

深度优先遍历
  1. 前序遍历(Pre-order traversal):先访问根节点,然后递归地前序遍历左子树,再递归地前序遍历右子树。

在这里插入图片描述

深度优先遍历(前序遍历)
F, B, A, D, C, E, G, I, H.

  1. 中序遍历(In-order traversal):先递归地中序遍历左子树,然后访问根节点,最后递归地中序遍历右子树。在二叉搜索树中,中序遍历会按照升序访问节点的值。
    在这里插入图片描述

深度优先遍历(中序遍历)
A, B, C, D, E, F, G, H, I.

  1. 后序遍历(Post-order traversal):先递归地后序遍历左子树,然后递归地后序遍历右子树,最后访问根节点。
    在这里插入图片描述

深度优先搜索(后序遍历):
A, C, E, D, B, H, I, G, F.

广度优先遍历

和深度优先遍历不同,广度优先遍历会先访问离根节点最近的节点。二叉树的广度优先遍历又称按层次遍历。算法借助队列实现。 其遍历顺序是
在这里插入图片描述

广度优先遍历 - 层次遍历:
F, B, G, A, D, I, C, E, H.

代码实现(Go)

// TreeNode 二叉树节点结构体
type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

// NewTreeNode  构造方法
func NewTreeNode(v int) *TreeNode {
	return &TreeNode{
		Left:  nil, // 左子节点指针
		Right: nil, // 右子节点指针
		Val:   v,   // 节点值
	}
}

/** 层次遍历 **/
func levelOrder(root *TreeNode) []any{
		queue := list.New()
		queue.PushBack(root)
		
		nums := make([]any,0)
		for queue.Len()>0{
		  	// 出队
		  	node:= queue.Remove(queue.Front()).(*TreeNode)
		    // 保存节点
		    nums = append(nums,node.Val)
		    if node.Left != nil{
		    	 // 左子节点入队
		    	 queue.PushBack(node.Left)
		    }
		    if node.Right !=nil{
		    	 // 右子节点入队
		    	 queue.PushBack(node.Right)
		    }
		}
		return nums
}


func main() {
	/* 初始化二叉树 */
	// 初始化节点
	n1 := NewTreeNode(1)
	n2 := NewTreeNode(2)
	n3 := NewTreeNode(3)
	n4 := NewTreeNode(4)
	n5 := NewTreeNode(5)
	// 构建节点之间的引用(指针)
	n1.Left = n2
	n1.Right = n3
	n2.Left = n4
	n2.Right = n5

	fmt.Println(levelOrder(n1))

}

结果:
[1 2 3 4 5]


二叉树的应用:

  1. 搜索树(Search Tree):二叉搜索树是一种有序的二叉树,可以高效地进行搜索、插入和删除操作。
  2. 表达式树(Expression Tree):二叉树可以用于表示算术表达式,例如中序表达式、前序表达式或后序表达式。
  3. 哈夫曼树(Huffman Tree):二叉树可以用于构建哈夫曼编码,用于数据压缩。
  4. 线段树(Segment Tree):一种用于解决区间查询问题的二叉树结构。

参考

  • 树的遍历

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

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

相关文章

Linux系统维护:增加空闲内存的大小,以便进程有足够的基础内存(空闲内存)来运行

目录 一、问题 二、解决思路 (一)问题分析 (二)思路 1. 清理缓存 2. 结束不必要的进程 3. 优化应用程序和服务 4. 增加物理内存 5、注意事项 三、实际处理 (一)结束不必要的程序 (二…

批量规范化(batchnormalization)

ˆB 是小批量B的样本均值,σˆ B 是小批量B的样本标准差。应用标准化后,生成的小批量的平均 值为0和单位方差为1。由于单位方差(与其他一些魔法数)是一个主观的选择,因此我们通常包含 拉伸参数(scale&#…

vulfocus靶场之redis命令执行cve-2022-0543漏洞复现

漏洞: Redis是著名的开源Key-Value数据库,其具备在沙箱中执行Lua脚本的能力。 Debian以及Ubuntu发行版的源在打包Redis时,不慎在Lua沙箱中遗留了一个对象package,攻击者可以利用这个对象提供的方法加载动态链接库liblua里的函数&…

初始化Git仓库时应该运行哪个命令?

文章目录 初始化Git仓库时,你应该运行git init这个命令。这个命令的作用是在你当前所在的目录里创建一个新的Git仓库。这样,你就可以在这个目录里开始使用Git来管理你的文件了。 下面我给你举个详细的例子来说明一下: 首先,你需要…

网络原理-IP协议

一、IP协议报头 版本号:用来表示IP协议的版本,现在常用的IP协议有两个版本,IPv4和IPv6,其他版本可能只存在于实验室中,并没有被广泛的使用。 首部长度:用来表示IP报头的长度,因为存在"选项"字段,所以IP报头是可变长的,此处单位为4…

春秋云镜 CVE-2023-51048

靶标介绍: S-CMS v5.0 被发现存在SQLI。 开启靶场 根据题目查找S-CMS v5.0漏洞,百度没有查询到,使用必应搜索S-CMS v5.0 查找到githubCVE-2023-51052的描述 S-CMS v5.0 was discovered to contain a SQL injection... CVE-2023-51052 Git…

Python程序设计 字典

教学案例十 字典 1. 判断出生地 sfz.txt文件中存储了地区编码和地区名称 身份证的前6位为地区编码,可以在sfz.txt文件中查询到地区编号对应的地区名称 编写程序,输入身份证号,查询并显示对应的地区名称 若该地区编码不在文件中,…

11.事件处理

事件处理 我们可以使用 v-on 指令 (简写为 ) 来监听 DOM 事件,并在事件触发时执行对应的 JavaScript。用法:v-on:click"methodName" 或 click"handler" 事件处理器的值可以是 内联事件处理器:事件被触发时执行的内联 J…

不同版本vue安装vue-router

vue-router 是vue官网发布的一个插件库,单页面路由。vue 和 vue-router 之间版本也需要对应。 vue2.x版本使用vue-router3.x版本,vue3.x使用vue-router4.x版本,根据自己的需要选择合适的版本 1、可以在安装前查看vue-router版本,…

微信小程序开发笔记

微信小程序开发笔记 1 微信小程序的项目结构 2 页面组成 一个微信小程序是由一个或多个页面组成的,这些页面被存放在pages目录中。下面以pages 目录下的index页面为例展示其组成部分,index页面的组成部分如下图所示。 由上图可知,index页面…

Swift-20-基础数据类型

数据定义 语法规则 先来看下下面的代码 import Cocoavar num1 "four" //a var num2: String "four" //b var num3 4 //c var num4: Int 4 //d上面的几行代码都能正常运行,其中a和b行等价,c和d行等价。区另就在于是否声…

SpringBoot集成Sleuth

引入Maven依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId></dependency> 配置yml文件 bootstrap.yml文件增加如下配置 注&#xff1a;这个配置不是必须要&#…

嵌入式Linux开发实操(十七):Linux Media Infrastructure userspace API

视频和无线电流媒体设备使用的Linux内核到用户空间API,包括摄像机、模拟和数字电视接收卡、AM/FM接收卡、软件定义无线电(SDR)、流捕获和输出设备、编解码器设备和遥控器。典型的媒体设备硬件如下: 媒体基础设施API就是用于控制此类设备的,分五个部分。 第一部分V4L2 API…

Cpp_SDay03

何处染尘埃 文章目录 前言一、de bug二、disassembly&#xff08;代码变成汇编&#xff09;三、if loop总结 前言 重在坚持 一、de bug 消除bug&#xff08;debug&#xff09; ctrlaltm 再按1就调出了内存地址 可以在内存地址维度来看自己的赋值等 watch界面查看想查看的值 …

SpringCloud(二)

2.4、OpenFeign 请求需要的controller层代码实现跨项目的数据联调 OpenFeign是一个声明式的http客户端&#xff0c;是SpringCloud在Eureka公司开源的Feign基础上改造而来。官方地址: https:/lgithub.com/OpenFeign/feign 其作用就是基于SpringMVC的常见注解&#xff0c;帮我们优…

如何在本地创建一个新的Git仓库?

文章目录 **步骤一&#xff1a;开启项目之旅****步骤二&#xff1a;启动Git引擎****步骤三&#xff1a;验证仓库初始化情况****步骤四&#xff1a;填充项目内容****步骤五&#xff1a;保存更改——初次提交****&#xff08;可选步骤六&#xff1a;关联远程仓库并推送&#xff0…

还在找投稿邮箱?推荐一个靠谱的投稿平台给你

亲爱的朋友: 听说你还在为单位的信息宣传投稿考核而烦恼,四处寻找投稿邮箱,却屡屡碰壁,是吗?别着急,作为过来人,我想给你推荐一个靠谱的投稿平台——智慧软文发布系统网站。相信它能帮你轻松完成考核任务,让你的稿件更快更好地被媒体采纳。 想当年,我也曾像你一样,为了完成单…

分析和比较深度学习框架 PyTorch 和 Tensorflow

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 深度学习作为人工智能的一个重要分支&#xff0c;在过去十年中取得了显著的进展。PyTorch 和 TensorFlow 是目前最受欢迎、最强大的两个深度学习框架&#xff0c;它们各自拥有独特的特点和优势。 1. Py…

2024HW ---->内网横向移动

在蓝队的面试过程中&#xff0c;如果你会内网渗透的话&#xff0c;那是肯定的一个加分选项&#xff01;&#xff01;&#xff01; 那么从今天开始&#xff0c;我们就来讲一下内网的横向移动&#xff01;&#xff01;&#xff01; 目录 1.域内任意用户枚举 2.Password-Sprayi…

node的事件循环

异步同步啥的就不多说了&#xff0c;直接看node中有哪些是异步 其中灰色部分和操作系统有很大的关系&#xff0c;就不多说了&#xff0c;其中定时器属于timers队列&#xff0c;I/O操作属于poll队列&#xff0c;setImmediate属于check队列&#xff0c;其中nextTick和promise不属…