数据结构与算法(七)

news2024/12/26 21:39:47

二叉树

如果说树中的每个结点最多只能有两个子结点,这样的树我们就称为二叉树,二叉树可以为空。

特点:

  • 每个结点最多有两棵子树,所以二叉树中不存在度大于二的结点棵树中,最大的结点的度称为树的度,结点的度:结点所拥有的了树的个数
  • 左子树和右子树是有顺序的,次序不能任意的颠倒
  • 即使树某结点只有一棵子树,也要去区分它是左子树还是右子树

性质:

  • 在二叉树中,第i层上最多有2^i-1次结点 (i>=1)  第一层: 2 ^1-1
  • 在二叉树中,如果深度为k,那么最多有2^k - 1个结点

形态:

  • 空树
  • 只有一个根结点
  • 只有一个左子树
  • 只有一个右子树
  • 左子树、右子树都有

满二叉树:在一棵二叉树中,所有的分支结点都存在左子树和右子树,并目叶了都在同一层上。

全二叉树: 除最后一层外,每一层上的结点数均达到最人值。最后一层只缺少有边的若干结点

满二叉树一定是完全二叉树,反过来不一定成立

二叉树的存储:数组、链表,最合适用链表

二叉搜索树

二叉搜索树,BST,binary search tree。二叉查找树、二叉排序树。

二叉搜索树其实就是普通的二叉树上加了一些限制 

限制与要求

二叉树对于结点是没有任何的限制,但是在二叉搜索树中在插入子结点的有一些特殊的要求:

  • 非空左子树的所有的键值都小于其根结点的键值
  • 非空右子树的所有键值都大于其根结点的键值
  • 左右子树本身也都是二叉搜索树

二叉搜索树的特点:相对较小的值总是保存在左子结点上,相对较大的值总是保存在右子结点上 

class Node {
	constructor(value) {
		this.value = value;
		this.left = null;
		this.right = null;
	}
}
// 相对小的值:左边 相对大的值:右边
class BinarySearchTree {
	constructor() {
		// 根节点
		this.root = null;
	}
	// 插入值比较
	insertNode(node, newNode) {
		if (newNode.value > node.value) {
			// 右边
			if (node.right === null) {
				node.right = newNode
			} else {
				this.insertNode(node.right, newNode);
			}
		} else if (newNode.value < node.value) {
			// 左边
			if (node.left === null) {
				node.left = newNode
			} else {
				this.insertNode(node.left, newNode);
			}
		}
	}
	// 插入,判断空树
	insert(value){
		let newNode = new Node(value);
		if(this.root === null){
			this.root = newNode;
		}else{
			this.insert(this.root,newNode)
		}
	}
}
const bst = new BinarySearchTree();

遍历

遍历:不重复的访问二叉树中所有的结点,

方式:先序遍历,中序遍历,后序遍历

1.先序遍历

  • 访问根结点
  • 先序遍历其左子树
  • 先序遍历其右子树

2.中序遍历

  • 先递归遍历其左子树,从最后一个左子树开始存入数组,
  • 然后回溯遍历双亲结点,
  • 再是右子树。递归循环

3.后序遍历

  • 后序遍历其左子树
  • 后序遍历其右子树
  • 访问根结点
class Node {
	constructor(value) {
		this.value = value;
		this.left = null;
		this.right = null;
	}
}
// 相对小的值:左边 相对大的值:右边
class BinarySearchTree {
	constructor() {
		// 根节点
		this.root = null;
	}
	// 先序遍历
	preOrederTraversal(cb){
		this.preOrderNode(this.root,cb);
	}
	preOrderNode(node,cb){
		// 空节点直接返回
		if(node === null) return
		// 打印
		cb(node.value);
		//遍历所有左子树
		this.preOrderNode(node.left,cb);
		// 遍历所有右子树
		this.preOrderNode(node.right,cb);
	}
	// 中序遍历
	inOrederTraversal(cb){
		this.inOrderNode(this.root,cb);
	}
	inOrderNode(node,cb){
		// 空节点直接返回
		if(node === null) return
		//遍历所有左子树
		this.inOrderNode(node.left,cb);
		// 打印
		cb(node.value);
		// 遍历所有右子树
		this.inOrderNode(node.right,cb);
	}
	// 后序遍历
	afterOrederTraversal(cb){
		this.afterOrderNode(this.root,cb);
	}
	afterOrderNode(node,cb){
		// 空节点直接返回
		if(node === null) return
		//遍历所有左子树
		this.afterOrderNode(node.left,cb);
		// 遍历所有右子树
		this.afterOrderNode(node.right,cb);
		// 打印
		cb(node.value);
	}
}
const bst = new BinarySearchTree();
const rst =  []
const cb = (val)=>{
	rst.push(val);
}
bst.preOrederTraversal(cb);

4.最大值与最小值

max(){
		let node = this.root;
		while(node.right !== null){
			node = node.right;
		}
		return node.value
	}
	min(){
		let node = this.root;
		while(node.left !== null){
			node = node.left;
		}
		return node.value
	}

5、寻找特定的值

search(val) {
		let node = this.root;
		while (node !== null) {
			if (node.value > val) {
				node = node.left;
			} else if (node.value < val) {
				node = node.right;
			}else{
				return true;
			}
		}
	}

6.删除

三种情况

  • 没有子树

  • 仅有一棵子树

  • 有两棵子树(保证中序遍历顺序不变)


二叉搜索树的优点:作为数据存储的结构有重要的意义,可以快速的找到给定的关键字的数据项,并且可以快速的插入和删除数据

二叉搜索树的缺点:具有局限性。同样的数据,可以对应不同的二叉搜索树

比较好的二叉搜索树的结构:左右分布均匀的,但是我们插入连续的数据的时候,会导致数据分布不均匀 我们就把这个分布不均匀的树称之为非平衡树
平衡树: AVL,红黑树 

当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可以降低树的高度,从而减少平均搜索长度。

 

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

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

相关文章

Git 分支相关操作

1 创建一个分支 Create a new directory and initialize a Git repository. We are going to create a directory named “tutorial”. $ mkdir tutorial $ cd tutorial $ git init Initialized empty Git repository in /Users/eguchi/Desktop/tutorial/.git/进入这个tutori…

一篇文章全面了解光分路器、PLC分路器、拉锥分路器

光纤分路器 光纤分路器&#xff0c;又称为分光器&#xff0c;是将一根光纤信号按照既定的比例分解为两路或多路光信号输出&#xff0c;是接入FTTH方式的光无源器件。 例如&#xff0c;一个1x4光分路器就是将一根光纤中的光信号按照一定的比例分配给四根光纤。与WDM系统的波分复…

【Java入门】运算符

前言 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于Java入门篇系列&#xff0c;该专栏主要讲解&#xff1a;什么是java、java的数据类型与变…

放大镜-第14届蓝桥杯省赛Scratch中级组真题第3题

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第138讲。 放大镜&#xff0c;本题是2023年5月7日举行的第14届蓝桥杯省赛Scratch图形化编程中级组编程第3题&#xff0…

MAC环境下使用 xray 工具

这里不做过多介绍&#xff0c;下面链接讲的非常清楚&#xff0c;下面记录一下遇到的坑。 https://docs.xray.cool/#/tutorial/webscan_basic_crawler Mac环境下选择对应的工具 下载完以后&#xff0c;放入自己的目录下&#xff0c;打开终端查看版本信息 ./xray_darwin_amd64 v…

Jupyter程序安装和使用指南【操作示例】

Jupyter Notebook(简称Jupyter)是一个交互式编辑器&#xff0c;它支持运行40多种编程语言&#xff0c;便于创建和共享文档。Jupyter本质上是一个Web应用程序&#xff0c;与其他编辑器相比&#xff0c;它具有小巧、灵活、支持实时代码、方便图表展示等优点。下面分别为大家演示如…

在CTEX文档生成中使用WinEit编辑带有公式符号的中文文档应用举例

CTEX文档生成中使用WinEit编辑带有公式符号的中文文档应用举例 CTEX在编辑文档格式和排版时具有优秀的性能&#xff0c;可批量处理文档格式&#xff0c;该用格式时候也非常快捷。下面举例介绍CTEX文档生成中怎样使用WinEit编辑带有公式符号的中文文档。 1.需要的代码 .在WinEi…

IT入门深似海,入门到放弃你学废了嘛

我一直觉得IT行业 程序员行业。甚至觉得程序员人群 是一个特殊存在的群体。 入门到放弃&#xff0c;是真的&#xff0c;IT门槛高嘛。 其实吧&#xff0c;IT编程门槛&#xff0c;是有的&#xff0c;但是对于感兴趣的&#xff0c;想学习IT编程同学来说&#xff0c;也是一件容易事…

Few-Shot Knowledge Graph Completion

[1911.11298] Few-Shot Knowledge Graph Completion (arxiv.org) 目录 Background Model Encoding Heterogeneous Neighbors Aggregating Few-Shot Reference Set Matching Query and Reference Set Matching Query and Reference Set Background 以往的KGC认为每个关系…

【微信小程序】微信小程序集成高德卫星地图完成多边形绘制与截图保存

目录 功能需求 使用的技术点 注意点 实现步骤 代码 微信小程序-地图所在的wxml 微信小程序-地图所在的js 微信小程序-展示截图结果的wxml 微信小程序-展示截图结果的js H5-地图所在的html 完成效果 感谢阅读&#xff0c;欢迎讨论 功能需求 打开页面展示卫星地图&…

震惊!人工智能引发灰色经济,ChatGPT变身罪魁祸首!

人工智能技术的日益发展和普及&#xff0c;其呈现出无边界的开发空间&#xff0c;引领出无数的商业应用&#xff0c;越来越多的领域开始依赖这一技术&#xff0c;各种应用场景日益丰富&#xff0c;而其内在的巨大潜力也被不断开发。随之而来的则是&#xff0c;因为技术的滥用和…

13 张图,带你深入理解Synchronized,吊打所有大厂面试官

前言 分享一篇优质文章给你。 本文带读者们由浅入深理解Synchronized&#xff0c;让读者们也能与面试官疯狂对线&#xff0c;同时写出高性能的代码和架构。 在并发编程中Synchronized一直都是元老级的角色&#xff0c;Jdk 1.6以前大家都称呼它为重量级锁&#xff0c;相对于J…

freertos任务优先级分配

RQ 任务&#xff1a;IRQ 任务是指通过中断服务程序进行触发的任务&#xff0c;此类任务应该设置为所有任务里面优先 级最高的。高优先级后台任务&#xff1a;比如按键检测&#xff0c;触摸检测&#xff0c;USB 消息处理&#xff0c;串口消息处理等&#xff0c;都可以归为这一类…

Flink自定义函数之表值聚合函数(UDTAGG函数)

1.表值聚合函数概念 自定义表值聚合函数&#xff08;UDTAGG&#xff09;可以把一个表&#xff08;一行或者多行&#xff0c;每行有一列或者多列&#xff09;聚合成另一张表&#xff0c;结果中可以有多行多列。 理解&#xff1a;假设有一个饮料的表&#xff0c;这个表有 3 列&a…

MF矩阵分解——SVD、LFM、RSVD、SVD++

文章目录 1 矩阵分解MF针对问题2 解决思路2.1 引例2.2 实际应用中 3 MF的几种方式3.1 特征值分解特征值、特征向量特征值分解缺点 3.2 奇异值分解(SVD)示例&#xff1a;基本定理计算步骤缺点 3.3 Basic SVD&#xff08;LFM、Funk SVD&#xff09;3.4 RSVD进一步优化 3.5 SVD 4 …

mybatis高频面试题

什么是mybatis mybatis框架是一个开源的数据持久性层框架它的内部封装了通过JDBC访问数据库的操作&#xff0c;支持普通的SQL查询、存储过程和高级映射&#xff0c;几乎消除了所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis作为持久层框架&#xff0c;其主要思想是…

【完美解决】mysql启动不了:本地计算机上的MySQL服务启动后停止

本文基于mysql8.0&#xff0c;5.7也可以参考 navicat 突然莫名其妙连不上mysql 查看服务&#xff0c;也启动不了&#xff0c;手动启动出现错误&#xff1a; 本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止 20230525更新&#xff01; 先…

Jmeter组件:Random CSV Data Set Config(随机读取文件数据)

一、Jmeter组件&#xff1a;Random CSV Data Set Config(随机读取文件数据) 功能&#xff1a;该组件可以随机读取CSV文件中的每一行的数据 二、下载插件&#xff1a;(jmeter-plugins-random-csv-data-set-xx.jar),并放到lib/ext目录下&#xff0c;重启jmeter 也可以在Jmeter…

【软考-中级】系统集成项目管理工程师【12 沟通和关系人】

持续更新。。。。。。。。。。。。。。。 【第十二章】沟通和关系人 2 分 12.1 沟通的基本概念12.1.1沟通的定义11.1.2 沟通的方式 12.2制订沟通管理计划12.2.1制订沟通管理计划的输入12.2.2制订沟通管理计划的工具 12.3 管理沟通12.3.1管理沟通输入12.3.2管理沟通的工具12.3.3…

IMX6ULL裸机篇之RTC实验原理

一. RTC实时时钟简介 实时时钟是很常用的一个外设&#xff0c;通过实时时钟我们就可以知道年、月、日和时间等信息。 因此在需要记录时间的场合&#xff0c;可以使用专用的实时时钟芯片来完成此功能。 但是&#xff0c;现在大多数的 MCU 或者 MPU 内部就已经自带了实时时钟外…