初学算法心得-二叉搜索树

2023-10-27

初学算法的心得笔记-二叉搜索树

二叉搜索树

二叉搜索树的结点

struct Node{
	int key;
	Node *parent, *left, *right;
};

插入

insert以根为节点寻找z该插入的位置。设当前节点为x,如果z的键值小于x, 则将当前节点的左子节点作为下一个节点x,反之则以右节点作为下一个节点x。如此不断向叶节点搜索。在此过程中,程序将前一个节点保存在y里,用作z的候选父节点。当x抵达NIL时搜索结束,此时的y就是z的父节点了。

void insert(int k){
	Node *y = NIL;
	NOde *x = root;
	Node *z;

	z = (Node *)malloc(sizeof(Node));
	z->key = k;
	z->left = NIL;
	z->right = NIL;

	while(x != NIL){
		y = x;
		if(z->key < x->key){
			x = x->left;
		}
		else{
			 x = x->right;
		}
	}

	z->parent = y;
	if(y == NIL){
		root = z;
	}
	else{
		if(z->key < y->key){
			y->left = z;
		}
		else{
			y->right = z;
		}
	}
}

搜索

find 操作要在二叉搜索树中找出含有键值k的节点x

find(x, k)
{
	while(x != NIL and k != x.key)
	{
		if(k < x.key)
			x = x.left;
		else
			x = x.right;
	}
	return x;
}

我们以根节点为起点调用 find 函数,从根向叶搜索节点。如果给定键值小于当前节点x的键值,那么搜索目标移动至左节点继续搜索,反之移动至右节点。键值不存在时返回NIL

删除

deleteNode 函数用于从二叉搜索树T 中删除节点z

deleteNode(T, z){
	if(z.left == NIL || z.right == NIL){
		y = z;
	else 
		y = getSuccessor(z);
	
	if(y.left != NIL)
		x = y.left;
	else
		x = y.right;
	if(x != NIl)
		x.parent = y.parent;
	
	if(y.parent == NIL)
		root = x;
	else if (y == y.parent.left)
		y.parent.left = x;
	else
		y.parent.right = x;
	
	if (y != z)
		z.key = y.key;

getSuccessor(x) 用于求x的后一个节点

getSuccessor(x){
	if(x.right != NIL)
		return getMinimum(x.right)
	y = x.parent;
	while(y != NIl && x == y.right)
	{
		x = y;
		y = y.parent;
	}
	return y;
}

getMinimum(x) 会在以x 为根的子树中搜索并返回键值最小的节点

getMinimum(x){
	while(x.left != NIL)
		x = x.left;
	return x;
}

通过标准库管理集合

管理元素的 STL 容器可大致分为两类。一类是有顺序的集合,称为 序列式容器 ;另一类是经过排序的容器,称为关联式容器
序列式容器添加元素的位置与元素本身(值)无关 STL中有 vectorlist 等;
关联式容器 添加元素的位置与元素本身(值)有关STL 为用户提供了 setmapmultisetmultimap 容器
关联式容器 在管理数据的过程中会自动给元素排序。虽然序列式容器也可以进行排序,但关联式容器优点在于可以随时采用二分搜索法,搜索效率极高。

  • set
#include<set> 用来将STL中的set包含在程序中

set<int> s; 用于申明一个set集合s;

set 的成员函数示例:

函数 功能 复杂度
size() 返回set中的元素数 O(1)
clear() 清空set O(n)
begin() 返回指向set开头的迭代器 O(1)
end() 返回指向set末尾的迭代器 O(1)
insert(key) 向set中插入元素key O(logn)
erase(key) 删除含有key的元素 O(logn)
find(key) 搜索与key一致的元素,并返回指向该元素的迭代器。没有与key一致的元素,则返回末尾end() O(logn)
  • map
    map集合以键和值的组合为元素,每个元素拥有1个键和1个值,集合以键作为排序的标准。各元素的键唯一,不存在重复。map可以看做是一种能使用任意类型下标的的关联式容器
#include<map>
用来将STL中的map包含在程序中

map<string, int> T;
这里是声明了一个以string为键的int型元素;

pair为STL提供的结构体模板,其第一个元素可用first访问,第二个元素可用second访问
map的成员函数示例:

函数名 功能 复杂度
size() 返回map中的元素数 O(1)
clear() 清空map O(n)
begin() 返回指向map开头的迭代器 O(n)
end() 返回指向map末尾的迭代器 O(1)
insert((key, val)) 向map中插入元素(key, val) O(logn
erase(key) 删除含有key 的元素 O(logn)
find(key) 搜索与key一致的元素,并返回指向该元素的迭代器。没有与该元素一致的元素,则返回末尾end() O(logn)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

初学算法心得-二叉搜索树 的相关文章

  • Asp.net core默认路由

    简化版Startup code public void ConfigureServices IServiceCollection services services AddMvc public void Configure IApplica
  • 从实体获取单列

    如何从查询中获取单个列而不是整个对象 我可以这样做来获取整个对象 但我想要的只是名称 IList
  • EventHandler 应该始终用于事件吗?

    我一直在愉快地使用自定义委托类型和通用编写事件Action委托类型 没有真正考虑我在做什么 我有一些很好的扩展助手Action and EventHandler这使我倾向于使用那些预定义的委托类型而不是我自己的委托类型 但除此之外 除了惯例
  • 通过 SOAP 的 Gmt php 或 UTC C# 等效项

    is C DateTime UtcNow和 PHPdate c 是等价的 我怀疑 因为当我肥皂时 我得到了 C
  • 以下 PLINQ 代码没有改进

    我没有看到使用以下代码的处理速度有任何改进 IEnumerable
  • PrivateObject 找不到属性

    我的结构基本上如下所示 abstract class A protected string Identificator get set private void DoSomething DoSomethingSpecific protect
  • 关闭整数的最右边设置位

    我只需要关闭最右边的设置位即可 我的方法是找到最右边位的位置 然后离开该位 我编写这段代码是为了这样做 int POS int n int p 0 while n if n 2 0 p else break n n 2 return p i
  • 判断串口是普通COM还是SPP

    我正在寻找一种方法来确定 COM 是标准 COM 还是 SPP COM 也称为 COM 设备的电缆替换蓝牙适配器 我有一个可以在 USB COM gt USB 和蓝牙下工作的设备 并且蓝牙接口可以与 SPP 一起工作 我目前正在使用Syst
  • 检测 TextBox 中的 Tab 键按下

    I am trying to detect the Tab key press in a TextBox I know that the Tab key does not trigger the KeyDown KeyUp or the K
  • 如何增加ofstream的缓冲区大小

    我想增加 C 程序的缓冲区大小 以便它不会过于频繁地写入 默认缓冲区是 8192 字节 我尝试使用 pubsetbuf 将其增加到 200K 原始代码 ofstream fq fastq1 cstr ios out fastq1 is a
  • 如何在新窗口中打开图像或pdf文件?

    我有一个 gridview 它包含文件名和文件路径 图像和 pdf 格式文件 其中我使用了模板字段 在该字段下放置了 1 个图像按钮 单击该图像按钮 即 查看 按钮 时 我想在新窗口中打开所选文件 这是我的代码 protected void
  • MSChart 控件中的自定义 X/Y 网格线

    我有一个带有简单 2D 折线图的 C Windows 窗体 我想向其中添加自定义 X 或 Y 轴标记 并绘制自定义网格线 例如 以突出显示的颜色 虚线 我查看了 customLabels 属性 但这似乎覆盖了我仍然想显示的默认网格 这是为了
  • 在 C++ 代码 gdb 中回溯指针

    我在运行 C 应用程序时遇到段错误 在 gdb 中 它显示我的一个指针位置已损坏 但我在应用程序期间创建了 10 万个这样的对象指针 我怎样才能看到导致崩溃的一个 我可以在 bt 命令中执行任何操作来查看该指针的生命周期吗 谢谢 鲁奇 据我
  • 如何对STL向量进行排序?

    我想排序一个vector vector
  • WPF DataGrid - 在每行末尾添加按钮

    我想在数据网格的每一行的末尾添加一个按钮 我找到了以下 xaml 但它将按钮添加到开头 有人知道如何在所有数据绑定列之后添加它吗 这会将按钮添加到开头而不是末尾
  • 用数组或向量实现多维数组

    我想使用单个数组或向量实现多维数组 可以像通常的多维数组一样访问它 例如 a 1 2 3 我陷入困境的是如何实施 操作员 如果数组的维数为 1 则 a 1 应该返回位于索引 1 处的元素 但是如果维数大于一怎么办 对于嵌套向量 例如 3 维
  • 不使用放置 new 返回的指针时的 C++ 严格别名

    这可能会导致未定义的行为吗 uint8 t storage 4 We assume storage is properly aligned here int32 t intPtr new void storage int32 t 4 I k
  • 值和类型的简洁双向静态 1:1 映射

    我将从我想象如何使用我想要创建的代码开始 它不必完全像这样 但它是我在标题中所说的 简洁 的一个很好的例子 就我而言 它是将类型映射到相关的枚举值 struct bar foo
  • 初始化列表在 VC10 中不起作用

    我在 VC 2010 中编写了这个程序 class class1 public class1 initializer list
  • 如何知道 HTTP 请求标头值是否存在

    我确信这很简单 但是却让我感到厌烦 我在 Web 应用程序中使用了一个组件 它在 Web 请求期间通过添加标头 XYZComponent true 来标识自身 我遇到的问题是 如何在视图中检查此组件 以下内容不起作用 if Request

随机推荐

  • ConstraintLayout实用特性

    转载自赵彦军的博客 前言 在2016年的Google I O大会上 Google 发布了Android Studio 2 2预览版 同时也发布了Android 新的布局方案 ConstraintLayout 但是最近的一年也没有大规模的使用
  • 【ABviewer从零开始教学查看器篇②】关于打开文件的快捷方式

    ABViewer是一款高质量 高效率 低成本的多功能设计及工程文档管理工具 能为您提供全面的专业的浏览及编辑功能 同时支持30多种光栅和矢量图形格式 在小编看来 ABViewer是一款非常简单且实用的CAD文档查看与编辑器 对于使用小白可能
  • 判断是否是数组

    整理了一些 留待自己复习用 1 instanceof var a name fangxiaoming age 19 var b 1 2 3 4 console log a instanceof Array false console log
  • 【翻译】我们建立了一个.NET操作员SDK(所以您不必这样做)。

    我们用C 语言构建了一个 NET操作者SDK 因此您可以用C 或任何 NET语言构建自己的Kubernetes操作者 当然也 有Go Operator SDK 还有我们的Java Operator SDK 那么为什么不为 NET社区提供一些
  • 用 Visual Studio 2019 编译 FFmpeg 简单教程

    需要的东西 Visual Studio 2019 这个自行解决吧 本人用的是社区版 MSYS 环境 去 https www msys2 org 下载 本人下载的是 msys2 x86 64 20210725 exe yasm exe 去 h
  • Security in IP-Based IoT Node and Device Authentication

    Abstract The IoT security aims for enabling IoT data protection in various interconnected nodes These frameworks require
  • 触屏fling/scroll/drag的区别及其详细过程

    原文地址 Android 触屏fling scroll drag的区别及其详细过程 作者 飘锦丹枫 Google了一下 终于搞清了touch screen下的几种操作模式 对应的是事件 对于一个view 常用的操作有点击 click 和长按
  • 原生js实现ajax请求(带请求头header)和数据传参过程代码

    一 Ajax 概述 Ajax 是 Asynchronous Javascript And XML 的简写 Ajax是一门技术 并不是一门语言 使用XHTML CSS来标准化呈现 使用XML和XSLT进行数据交换及相关操作 使用XMLHttp
  • java程序输出中文乱码解决方案

    标题java程序输出中文乱码解决方案 乱码如下 你好 在一些Java程序中我们输入的中文在输出时会出现乱码的情况 一下是解决方案 1 在编译xx java文件时使用javac encoding utf 8 xx java语句进行编译可以解决
  • sed 过滤字符文本 (一行行的)

    前面写过用sed对整个文件过滤的 代码很简单 现在这个是能够取出其中的一行行来过滤的 为了获取更多的相关信息 注意列表中的空格先变为 然后再变回来 不然会出错 bin sh i grep chenbing my c temp sed s g
  • 关于代码评审

    总结于 代码之丑 专栏 郑晔 为何要做代码评审 代码评审 也就是很多人熟悉的 Code Review Wikipedia 上定义是这样的 代码评审 是指对计算机源代码系统化地审查 常用软件同行评审的方式进行 其目的是在找出及修正在软件开发初
  • c#处理json数据

    这篇文章讲的很详细 亲测可行 此外我在添加一点注意事项 1 json转C 实体类 之前用了一个转的不行 害的我半天弄不出来 后面找到一个 JSON转C 实体类 BeJSON com 这个转出来的很不错 一下子就成功了 2 如果想在没有环境的
  • Chrome插件消息传递实例

    首先吐槽 360极速浏览器应用开发平台 的开发文档 在消息传递 http open chrome 360 cn extension dev messaging html 一节中 翻译极其低劣 Sending a request from t
  • SpringBoot通过自定义字段注解以及反射获取对象

    在Java的开发过程中 注解的应用场景是非常广泛的 Java也提供了很多内置的注解 比如 Override Deprecated SuppressWarnings等等 之前也写过一篇注解相关的文章 SpringBoot自定义注解 AOP以及
  • mysql机制_Mysql 重连机制<转载>

    连续两天早上发现服务上不去了 mysql server has gone away 然后又通过mysql客户端连了一下mysql 没问题 看来是程序写错了 我的connection没有重连机制 查了一下相关的资料 django是每次操作都重
  • MA35D1记录1-源码编译

    上面是我的微信和QQ群 欢迎新朋友的加入 今天年假结束 突然发现新唐即将发布MA35D1 去官网和git仓库查了下 新唐趁我放假又偷偷更新了一些资料 之前发布的是yocto的环境 那个我倒也用 但时不时要翻墙 对国内用户来说 多少有点恶心人
  • linux(centos7)下建立web页面

    我打算从centos7配置IP开始记录 就是记录一下我的搭建过程 1 在VMware虚拟机选择centos7镜像安装完毕后 设置用户 密码 发现进入的是图形化界面 于是通过CTRL ALT F3进入命令行界面 现在用的VMware版本导致我
  • 【搞一点AUTOSAR】基于TC397的MACL-ADC配置解读(使用EB)

    搞一点AUTOSAR 基于TC397的MACL ADC配置解读 使用EB 文章目录 搞一点AUTOSAR 基于TC397的MACL ADC配置解读 使用EB 前言 一 ADC模块介绍 1 ADC模块的功能 2 模块相关概念首字母缩略介绍 二
  • Kafka-Consumer 源码解析 -- listener 注册和启动

    Kafka Consumer 源码解析 consumer 启动 和 listener 注册和启动 前言 1 KafkaListener注解说明 2 listener注册 2 1 KafkaListenerAnnotationBeanPost
  • 初学算法心得-二叉搜索树

    初学算法的心得笔记 二叉搜索树 二叉搜索树 插入 搜索 删除 通过标准库管理集合 二叉搜索树 二叉搜索树的结点 struct Node int key Node parent left right 插入 insert以根为节点寻找z该插入的