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

news2024/12/26 20:45:04

在这里插入图片描述

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

二叉树(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):一种用于解决区间查询问题的二叉树结构。

参考

  • 树的遍历

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

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

相关文章

论文辅助笔记:处理geolife数据

论文笔记:Context-aware multi-head self-attentional neural network model fornext location prediction-CSDN博客 对应命令行里 python preprocessing/geolife.py 20 这一句 1 读取geolife数据 pfs, _ read_geolife(config["raw_geolife"], print_…

文本生成任务的评价方法BLEU 和 ROUGE

BLEU 是 2002 年提出的,而 ROUGE 是 2003 年提出的。这两种指标虽然存在着一些问题,但是仍然是比较主流的评价指标。 BLUE BLEU 的全称是 Bilingual evaluation understudy,BLEU 的分数取值范围是 0~1,分数越接近1&a…

Mysql The last packet sent successfully to the server was 0 milliseconds ago.

项目启动后,报错,但是我的navicat 数据库连接工具是连接上的,没有问题的,但是程序就是连接不上。端口放开了,防火墙也放开了 先说问题:是网络问题, 如何解决:因为我的机子上又跑了…

思颜肌密:匠心独蕴,传世掠影

赋予延绵岁月以华彩乐章,将来自时间的承诺注入生活每分每秒,在思颜肌密的世界里,恒久之美并非遥不可及,它是艺术,亦是心意。华美节日翩然而至,思颜肌密拉开神秘帷幕,在惊鸿掠影中向世人展现传世…

IO实现方式(同步阻塞、同步非阻塞、IO多路复用)

1. 同步阻塞IO 同步阻塞io在数据在数据拷贝到两个阶段都是阻塞的,即把socket的数据拷贝到内核缓冲区和把内核缓冲区的数据拷贝到用户态到应用程序缓冲区都是阻塞的。用户线程在这个期间不能处理其他任务。 优点:简单易用 缺点:为每一次io请…

基于Springboot+Vue的Java项目-网上超市系统开发实战(附演示视频+源码+LW)

大家好!我是程序员一帆,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &am…

腾讯后端一面:如果需要实现一个分布式锁,你该如何实现?

更多大厂面试内容可见 -> http://11come.cn 腾讯后端一面:如果需要实现一个分布式锁,你该如何实现? 分布式锁 如果让你来实现一个分布式锁,该如何实现? 实现分布式锁的话,肯定需要一个地方去存储锁的…

Python | Leetcode Python题解之第35题搜索插入位置

题目&#xff1a; 题解&#xff1a; class Solution:def searchInsert(self, nums: List[int], target: int) -> int:left, right 0, len(nums) #采用左闭右开区间[left,right)while left < right: # 右开所以不能有,区间不存在mid left (right - left)//2 # 防止溢出…

java线程-线程池

简介 工作原理 如何获取线程池对象 构造器的参数含义 注意事项 构造器-ThreadPoolExecutor // ArrayBlockingQueue 是一个有界的阻塞队列&#xff0c;它的内部实现是一个数组。有界的意思是它的容量是有限的&#xff0c;我们必须在创建 ArrayBlockingQueue 实例的时候指定容量…

IMUGNSS的误差状态卡尔曼滤波器(ESKF)---更新过程

IMU&GNSS的误差状态卡尔曼滤波器&#xff08;ESKF&#xff09;---更新过程 ESKF的更新过程 ESKF的更新过程 前面介绍的是ESKF的运动过程&#xff0c;现在考虑更新过程。假设一个抽象的传感器能够对状态变量产生观测&#xff0c;其观测方程为抽象的h,那么可以写为 其中z为…

科研基础与工具(论文搜索)

免责申明&#xff1a; 本文内容只是学习笔记&#xff0c;不代表个人观点&#xff0c;希望各位看官自行甄别 参考文献 科研基础与工具&#xff08;YouTube&#xff09; 搜索论文 Google Scholar 谷歌学术 涵盖面太全了&#xff0c;都收录&#xff0c;就会有很多低质量的论文…

NodeRed节点编辑用于边缘计算和规则引擎,能做带UI界面和业务逻辑的上位机或前端应用吗?

先说结论&#xff0c;可以&#xff0c;但是需要有页面嵌套继承类似的技术&#xff0c;实现页面模块化封装&#xff0c;否则难以实现复杂应用。 相信目光敏锐的人都在关注节点编辑在自身行业的应用&#xff01; NodeRed在边缘计算做数据协议解析、以及物联网平台中作为规则链引…

算法训练营day13

一、SlidingWindowMaximum(滑动窗口最大值) 前置题&#xff0c;155.最小栈 参考K神155. 最小栈 - 力扣&#xff08;LeetCode&#xff09; 做完最小栈的题能更好的理解这道题 鄙人想到了开辟空间来保存最小值&#xff0c;使用的HashMap&#xff1b;K神用的是栈逻辑优化 cla…

网盘_游戏_博客自动化部署(Nginx多项目部署)

目录 一.前提介绍 二.环境介绍 三.自述&#xff08;脚本&#xff09; 四.关于Nginx多项目部署 一.前提介绍 在我之前的博客里详细介绍了上述项目的部署&#xff0c;那么如何使用简单脚本自动部署和使用Nginx多项目部署是本文来介绍的基础篇章。 二.环境介绍 CentOS Linux…

吴恩达深度学习 (week5,6)

文章目录 一、训练开发测试集二、机器学习基础三、 正则化初步介绍四、Dropout 正则化五、其他正则化方法六、归一化输入介绍七、梯度消失与梯度爆炸八、神经网络的权重初始化九、梯度数值逼近和检验十、上述学习总结第一题 划分训练/开发/测试集第二题 开发和测试集分布第三题…

gradle安装和部署

准备工作 下载地址&#xff1a;https://gradle.org/releases/ 安装和配置环境变量 将压缩包解压到/usr/local/目录下 unzip gradle-8.7-bin.zip -d /usr/local/找到gradle的安装目录/usr/local/gradle-8.7 编辑/etc/vi /etc/profileprofile配置环境变量&#xff08;这是ce…

duke liver datasets数据处理

Duke liver datasets 如果大家是做医学图像处理的&#xff0c;刚好又是做肝脏那边的&#xff0c;对这个数据集应该不会陌生 我发现网上现有的资料很少有说怎么读取这个数据集的&#xff0c;由于我之前一直都是做的nii格式的数据集&#xff0c;现在碰到了dicom格式的数据集页研…

SQLite导出数据库至sql文件

SQLite是一款实现了自包含、无服务器、零配置、事务性SQL数据库引擎的软件库。SQLite是世界上部署最广泛的SQL数据库引擎。 SQLite 是非常小的&#xff0c;是轻量级的&#xff0c;完全配置时小于 400KiB&#xff0c;省略可选功能配置时小于250KiB。 SQLite 源代码不受版权限制。…

分类神经网络3:DenseNet模型复现

目录 DenseNet网络架构 DenseNet部分实现代码 DenseNet网络架构 论文原址&#xff1a;https://arxiv.org/pdf/1608.06993.pdf 稠密连接神经网络&#xff08;DenseNet&#xff09;实质上是ResNet的进阶模型&#xff08;了解ResNet模型请点击&#xff09;&#xff0c;二者均是…

数字阅览室解决方案

一、方案概述 “数字阅览室”概念一经提出&#xff0c;就得到了广泛的关注&#xff0c;纷纷组织力量进行探讨、研究和开发&#xff0c;进行各种模型的试验。随着数字地球概念、技术、应用领域的发展&#xff0c;数字阅览室已成为数字地球家庭的成员&#xff0c;为信息高速公路…