2025_2_13 二叉搜索树(一)

1.完全二叉树和满二叉树的概念

满二叉树:每一层都达到最大值
在这里插入图片描述
完全二叉树:只能右下角空,其他位置满,即最后一排从左到右的中间不能由缺
在这里插入图片描述

2.二叉搜索树

  1. 左子树中所有结点的 key 值都比根结点的 key 值小,并且左子树也是二叉搜索树。
  2. 右子树中所有结点的 key 值都比根结点的 key 值大,并且右子树也是二叉搜索树。

它是一种天然的递归结构

2.1 结构体创建的注意点

#pragma once
#include<stdbool.h>
#include<stdio.h>
#include<stdlib.h>typedef int K;typedef struct node {K key;	// 结点的唯一性标识,key是不重复的struct node* left;  // 左子树struct node* right; // 右子树
} TreeNode;// 推荐定义一个二叉搜索树的结构体,这样更便于扩展
typedef struct {TreeNode* root; // 根结点
}BST;// 基础操作
BST* bst_create();
void bst_destroy(BST* tree);bool bst_insert(BST* tree, K key);
TreeNode* bst_search(BST* tree, K key);
bool bst_delete(BST* tree, K key);void bst_preorder(BST* tree); // 先序遍历
void bst_inorder(BST* tree);  // 中序遍历
void bst_postorder(BST* tree);  // 后序遍历
void bst_levelorder(BST* tree); // 层次遍历

上述是创建结构体操作的代码,有以下注意点:

  • 使用K作为int的宏定义,提高代码的可修改性
  • 使用BST结构体创建根节点指针,避免传入二级指针,而且这样可读性高

2.2 插入操作的注意点

bool bst_insert(BST* tree, K key) {TreeNode* curr = tree->root;TreeNode* parent = NULL;int diff;while (curr != NULL) {diff = curr->key - key;if (diff > 0) {//往左走parent = curr;curr = curr->left;}else if (diff < 0) {//往右走parent = curr;curr = curr->right;}else {printf("error:key is overlap\n");return false;}}//现在curr指向待插入的位置,为NULL,parent指向其父节点//使用calloc创建新节点,可以避免忘记初始化TreeNode* new_node = calloc(1, sizeof(TreeNode));if (new_node == NULL) {printf("calloc failed in bst_insert\n");return false;}new_node->key = key;//如果插入的是第一个节点if (parent == NULL) {tree->root = new_node;return true;}//左边插入if (diff > 0) {parent->left = new_node;}//右边插入if (diff < 0) {parent->right = new_node;}return true;
}

上述是插入操作的代码,有以下注意点:

  • 二叉搜索树的插入一定是插入NULL位置,而不会是节点与节点之间,如果插入到节点之间,会破坏BST的性质,导致树不再有序。
  • 要设置当前节点和父节点用于遍历二叉树,因为父节点来做链接操作。
  • 可以用差值的形式来判断走哪边。
  • 创建新节点一定一定使用calloc来初始化,因为使用malloc极有可能会忘记初始化,导致下次在这个节点之后插入会报错。

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

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

相关文章

DeepSeek 突然来袭,AI 大模型变革的危机与转机藏在哪?

随着人工智能技术的飞速发展&#xff0c;大模型领域不断涌现出具有创新性的成果。DeepSeek 的横空出世&#xff0c;为 AI 大模型领域带来了新的变革浪潮。本文将深入探讨 DeepSeek 出现后 AI 大模型面临的危机与转机。 冲冲冲&#xff01;&#xff01;&#xff01; 目录 一、…

高速差分总线比较--RS422, LVDS,PECL

1. RS422A&#xff0c; 如RS422 & RS485总先&#xff0c; 0/5V的差分电平&#xff0c;匹配电阻120ohm. S2D&#xff0c; Transmitter D2S, Receiver LVDS 如SN65LVDS1&#xff0c;驱动器&#xff1a;DS90LV031&#xff08;支持预加重&#xff09;&#xff0c;接收器&…

idea 错误: 找不到或无法加载主类 @C:\Users\admin\AppData\Local\Temp\idea_arg_file1549212448

idea 错误: 找不到或无法加载主类 C:\Users\admin\AppData\Local\Temp\idea_arg_file1549212448 该错误往往和左下角爱弹出的如下提示是一个意思 Error running ‘PayV3Test1.testTransferBatchesBatchId’ Error running PayV3Test1.testTransferBatchesBatchId. Command lin…

Java中如何高效地合并多个对象的List数据:方法与案例解析!

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云/阿里云/华为云/51CTO&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互…

23、深度学习-自学之路-激活函数relu、tanh、sigmoid、softmax函数的正向传播和反向梯度。

在使用这个非线性激活函数的时候&#xff0c;其实我们重点还是学习的是他们的正向怎么传播&#xff0c;以及反向怎么传递的。 如下图所示&#xff1a; 第一&#xff1a;relu函数的正向传播函数是&#xff1a;当输入值&#xff08;隐藏层&#xff09;值大于了&#xff0c;就输出…

React源码揭秘 | scheduler 并发更新原理

React 18增加了并发更新特性&#xff0c;开发者可以通过useTransition等hooks延迟执行优先级较低的更新任务&#xff0c;以达到页面平滑切换&#xff0c;不阻塞用户时间的目的。其实现正是依靠scheduler库。 scheduler是一个依赖时间片分片的任务调度器&#xff0c;React团队将…

腿足机器人之二- 运动控制概览

腿足机器人之二运动控制概览 高层运动规划MPCRL 中层逆运动学和逆动力学底层执行器控制传感器校正 上一篇博客是腿足机器人的骨架和关节的机械和电气组件&#xff0c;关节不仅需要通过机械设计实现复杂的运动能力&#xff0c;还必须通过电子组件和控制系统来精确控制这些运动。…

企业级高可用 Kubernetes 实践:基于青云 LB 搭建容灾与负载均衡集群全攻略

一、前言 在企业生产环境,k8s高可用是一个必不可少的特性,其中最通用的场景就是如何在 k8s 集群宕机一个节点的情况下保障服务依旧可用。部署高可用k8s集群对于企业级云平台来说是一个根本性的原则,容错、服务可用和数据安全是高可用基础设施的关键。本文是在青云上利用青云…

软件项目估算偏差的5 大源头及解决方案

软件项目成本估算偏差往往导致资金紧张&#xff0c;资源投入受限&#xff0c;进度延误无法按时交付&#xff0c;为控制成本还可能牺牲质量&#xff0c;引发团队士气低落、客户不满&#xff0c;严重时项目直接失败 。 因此&#xff0c;及时解决或降低项目偏差就非常重要&#xf…

树莓派学习

树莓派4B 基础操作 开机 开机要主要先接好线再通电 关机 先在系统里面关机再断电 可以在界面里面点击关机&#xff0c;或者使用命令行 使用网线连接到树莓派 用笔记本的以太网口接线到树莓派 在网络连接里面打开WLAN的网络共享&#xff0c;共享选择以太网口 在cmd里面输…

Jenkins 新建配置 Freestyle project 任务 六

Jenkins 新建配置 Freestyle project 任务 六 一、新建任务 在 Jenkins 界面 点击 New Item 点击 Apply 点击 Save 回到任务主界面 二、General 点击左侧 Configure Description&#xff1a;任务描述 勾选 Discard old builds Discard old builds&#xff1a;控制何时…

一场始于 Selector Error 的拯救行动:企查查数据采集故障排查记

时间轴呈现事故进程 17:00&#xff1a;开发人员小李正在尝试利用 Python 爬虫从企查查&#xff08;https://www.qcc.com&#xff09;抓取公司工商信息。原本一切正常&#xff0c;但突然发现信息采集失败&#xff0c;程序抛出大量选择器错误。17:15&#xff1a;小李发现&#x…

HCIA项目实践---OSPF的基本配置

9.5.12 OSPF的基本配置 &#xff08;所搭环境如上图所示&#xff09; A 先配置IP地址 (先进入路由器R1的0/0/0接口配置IP地址&#xff0c;再进入环回接口配置IP地址) &#xff08;配置R2路由器的0/0/0和0/0/1以及环回接口的IP地址&#xff09; &#xff08;置R3路由器的0/0/0接…

Java练习(20)

ps:练习来自力扣 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空间。 class Solution {pu…

在ArcGIS JS API中使用WebGL实现波纹扩散特效

在现代WebGIS开发中&#xff0c;ArcGIS JS API 是一个非常强大的工具&#xff0c;它允许开发者创建丰富的地理信息应用。结合WebGL技术&#xff0c;我们可以实现更加复杂和炫酷的可视化效果。本文将介绍如何使用ArcGIS JS API结合WebGL实现一个波纹扩散特效。 波纹扩散效果 1 概…

基于图像处理的裂缝检测与特征提取

一、引言 裂缝检测是基础设施监测中至关重要的一项任务,尤其是在土木工程和建筑工程领域。随着自动化技术的发展,传统的人工巡检方法逐渐被基于图像分析的自动化检测系统所取代。通过计算机视觉和图像处理技术,能够高效、精确地提取裂缝的几何特征,如长度、宽度、方向、面…

支持向量机原理

支持向量机&#xff08;简称SVM&#xff09;虽然诞生只有短短的二十多年&#xff0c;但是自一诞生便由于它良好的分类性能席卷了机器学习领域。如果不考虑集成学习的算法&#xff0c;不考虑特定的训练数据集&#xff0c;尤其在分类任务中表现突出。在分类算法中的表现SVM说是排…

关于conda换镜像源,pip换源

目录 1. 查看当前下载源2. 添加镜像源2.1清华大学开源软件镜像站2.2上海交通大学开源镜像站2.3中国科学技术大学 3.删除镜像源4.删除所有镜像源&#xff0c;恢复默认5.什么是conda-forge6.pip换源 1. 查看当前下载源 conda config --show channels 如果发现多个 可以只保留1个…

消息中间件:RabbitMQ镜像集群部署配置全流程

目录 1、特点 2、RabbitMQ的消息传递模式 2.1、简单模式&#xff08;Simple Mode&#xff09; 2.2、工作队列模式&#xff08;Work Queue Mode&#xff09; 2.3、发布/订阅模式&#xff08;Publish/Subscribe Mode&#xff09; 2.4、路由模式&#xff08;Routing Mode&am…

财务主题数据分析-企业盈利能力分析

企业盈利能力数据主要体现在财务三张表中的利润表里面&#xff0c;盈利能力需要重点需要关注的指标有&#xff1a;毛利率、净利率、净利润增长率、营业成本增长率等&#xff1b; 接下来我们分析一下某上市公司披露的财务数据&#xff0c;看看该企业盈利能力如何&#xff1a; …