实用算法实现-第 5 篇 二分查找树

二分查找和二分查找树 预备知识:二分查找算法(折半查找法) 首先假设表中的元素时升序排列的,将表中间的位置和查找关键字比较: 1、如果相等,则查找成功 2、否则利用中间位置前后的两个子表: 1)如果中间位置大于目标更好换剪子,则用同样的方式再前一子表进行查找 2)否则在后一子表进行查找 重复上述过程,满足条件则成功;否则没有子表则失败。 一、插入位置 LeetCode35 题目: 给定一个排序数组和一个目标值,在数组... 阅读详情

5.1    二分查找树算法

《算法导论》中,二分查找树的伪代码如下:

ITERATIVE-TREE-SEARCH(x,k)

1  while x ≠ NIL and k ≠ key[x]

2      do if k < key[x]

3            thenx ← left[x]

4            elsex ← right[x]

5  return x

TREE-INSERT(T,z)

1  y ← NIL

2  x ← root[T]

3  while x ≠ NIL

4       do y ← x

5          ifkey[z] < key[x]

6             thenx ← left[x]

7             elsex ← right[x]

8  p[z] ← y

9  if y = NIL

10      thenroot[T] ← z

11      else if key[z] < key[y]

12              thenleft[y] ← z

13              elseright[y] ← z

5.1.1   实例

PKU JudgeOnline, 2418, Hardwood Species.

5.1.2   问题描述

输入一串树木的名字,统计树木在所有树木中所占的百分比。

5.1.3   输入

RedAlder

Ash

Aspen

Basswood

Ash

Beech

YellowBirch

Ash

Cherry

Cottonwood

Ash

Cypress

RedElm

Gum

Hackberry

WhiteOak

Hickory

Pecan

HardMaple

WhiteOak

SoftMaple

RedOak

RedOak

WhiteOak

Poplan

Sassafras

Sycamore

BlackWalnut

Willow

5.1.4   输出

Ash13.7931

Aspen3.4483

Basswood3.4483

Beech3.4483

BlackWalnut 3.4483

Cherry3.4483

Cottonwood3.4483

Cypress3.4483

Gum3.4483

Hackberry3.4483

HardMaple 3.4483

Hickory3.4483

Pecan3.4483

Poplan3.4483

RedAlder 3.4483

RedElm 3.4483

RedOak 6.8966

Sassafras3.4483

SoftMaple 3.4483

Sycamore3.4483

WhiteOak 10.3448

Willow3.4483

YellowBirch 3.4483

5.1.5   程序

#define MAX_WORD_LENGTH 31
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <iostream.h>
//定义BST结点
typedef struct BSTNode
{
    charkey[MAX_WORD_LENGTH];
    int value;
    BSTNode *lchild;
    BSTNode *rchild;
}BSTNode,*BSTree;
BSTreet=NULL;
int sum = 0;
//向BST插入结点
void insert_tree(char * key)
{
    //x指示查找过程中下降的路径,y始终指向x的父结点
    BSTree y=NULL;
    BSTree x=t;
    //x下降
    while(x)
    {      
        y = x;
         if(strcmp(x->key,key) == 0){
              x->value++;
              return;
         }else if(strcmp(x->key, key) >0){
              x = x->lchild;
         }else{
              x = x->rchild;
         }
    }
     BSTreenew_node = (BSTree)malloc(sizeof(BSTNode));
     new_node->lchild = NULL;
     new_node->rchild = NULL;
     strcpy(new_node->key, key);
     new_node->value = 1;
     //如果树为空
    if(t==NULL)
        t=new_node;
    else
    {
        //设置父结点的孩子结点
        if(strcmp(y->key,key) >= 0)
            y->lchild = new_node;
        else
            y->rchild=new_node;
    }
}
void inorder_tree_walk(BSTree x)
{
     if(x !=NULL)
     {
         inorder_tree_walk(x->lchild);
         printf("%s", x->key);
     //   printf("%d\n", x->value);
         printf("%.4f\n",(x->value * 100.0) / sum);
         inorder_tree_walk(x->rchild);   
     }
}
int main()
{
     chartemp[31];
     while(gets(temp))/*&& temp[0] != '#')*/
     {
         insert_tree(temp);
     //   cout << temp << endl;
         sum++;
     }
     inorder_tree_walk(t);
     return 1;
}

5.2    实例

PKU JudgeOnline, 2503, Babelfish.

PKU JudgeOnline, 2418, Hardwood Species.

PKU JudgeOnline, 1002, Exponentiation.

本文章欢迎转载,请保留原始博客链接http://blog.youkuaiyun.com/fsdev/article

Windows 10 本地开发环境:用 ShardingSphere-Proxy 5.4.1 快速搭建 MySQL 分库分表测试环境 本文详细介绍了在Windows 10系统中使用ShardingSphere-Proxy 5.4.1快速搭建MySQL分库分表测试环境的完整教程。从环境准备、MySQL配置到ShardingSphere-Proxy的核心设置,逐步指导开发者完成本地开发环境的搭建,并提供了分片策略详解和常见问题排查方法,帮助开发者高效验证分库分表功能。 阅读详情

相关推荐

RTX 4060笔记本也能跑!保姆级教程:用Ollama在Windows上部署DeepSeek-R1-8B模型

本文详细介绍了如何在RTX 4060笔记本上通过Ollama本地部署DeepSeek-R1-8B模型,提供从环境配置到性能调优的全流程优化指南。针对笔记本用户的显存、散热等问题,给出了量化模型选择、启动参数优化及散热解决方案,帮助用户在消费级硬件上高效运行大语言模型。

weixin_28745067的博客 525

算法学习之---二分搜索树

1.应用场景: 二分搜索树解决的是查找类问题,在数据有序的基础上,二分搜索树的查找效率为O(logN)。 2.二分搜索树: 是一个二叉树,满足条件1.所有节点的值大于其左子节值点小于其右子节点值;2.所有节点的值大于其左子树所有节点值,小于右子树所有节点值。 3.算法实现: 下面代码实现了二分搜索树的插入,删除,遍历(前序、中序、后续、广度优先),查找等操作 /*************************************************************...

j_oop的博客 701

Python RPA 流程自动化快速上手

Python RPA 流程自动化快速上手

看花容易绣花难 1万+

算法与数据结构--简单易懂的二分搜索树(java实现)

二分搜索树 二分搜索树,有时我们也简称二叉树,它是一种树形的数据结构,结构图如下: 但是二叉树结构不一定是完全二叉树(完全二叉树只是在有h层的二叉树中,在从1~h-1层的每个节点的子节点都是满的,且连续节点都集中在左边) 1、二分搜索树的优势 通常用于查找,通过键就可以获得值,插入也很方便,插入和查找时间复杂度都是O(logN). 从上图我们可以很清楚的比较,二分搜索树这种数据结构的性能是比较全...

追yi流年 683

YOLOv8工业级增强实战:小目标检测与HDR鲁棒性优化

YOLO(You Only Look Once)作为主流实时目标检测框架,其核心价值在于模块化架构与工程可扩展性。理解YOLOv8的Anchor-Free设计、C2f特征融合机制及Detect头部解耦原理,是实现性能突破的基础。在工业落地中,真实瓶颈往往不是模型版本迭代,而是小目标漏检、高动态范围(HDR)场景适应差、密集遮挡ID断裂等具体问题。通过配置层动态多尺度训练、物理感知数据增强、Neck跨尺度注意力注入、质量感知损失函数升级等七层增强策略,可在不更换主干的前提下显著提升mAP与边缘设备推理效率。本

weixin_32667439的博客 259

【yolov8】与yolov5的区别及改进详解

yolov8-----有点厉害的目标检测框架.

qq_44878985的博客 3万+

玩数据结构和算法-实现自己的二分搜索树

文章目录 二分搜索树 Binary Search Tree 二分搜索树是二叉树 二分搜索树的每个节点的值: 大于其左子树的所有节点的值 小于其右子树的所有节点的值 每一棵子树也是二分搜索树 存储的元素必须有可比较性 import java.util.LinkedList; import java.util.Queue; import java.util.Stack; public class BST<E extends Comparable<E>> { pri

hongxue8888的博客 323

告别手动复制粘贴:3种高效合并Excel表格的方法对比(含代码)

本文对比了VBA、Power Query和Python三种高效合并Excel表格的方法,并提供了可直接运行的代码。针对不同数据量、更新频率和技术背景,详细分析了各方案的优缺点与适用场景,帮助读者告别低效的手动操作,实现自动化数据整合。

weixin_29057237的博客 442

动画 | 什么是二分搜索树(附伪代码)

点击蓝色“五分钟学算法”关注我哟加个“星标”,天天中午 12:15,一起学算法来源 | 算法无遗策二分搜索树属性二分搜索树的又名比较多,有的叫二叉排序树,也有的叫二叉查找树,或者有序...

程序员吴师兄的博客 1310

思岚A1 上手教程

前言 寒假在家闲着也是闲着,索性就向是实验室借了一个思岚 A1激光雷达,来进一步完成自己的实验室实习项目。经过一个月在Linux上和ROS上的摸爬滚打,我已经对机器人开发和SLAM有了初步了解,现在就写个上手教程吧(以防自己以后忘了)。 Basic Support 硬件 一台电脑 思岚 A1激光雷达 软件 安装Virtual Box虚拟机 在虚拟机安装Ubuntu 16操作系统 在Ubuntu 16搭建ROS kinetic 简要步骤 1.现在w..

ajxdhe的博客 6384

51单片机 驱动有源/无源蜂鸣器+Proteus仿真

51单片机 驱动有源/无源蜂鸣器+Proteus仿真 相关篇《51单片机 Proteus仿真有源蜂鸣器始终不响原因及解决方法》 电路搭建 采用NPN管驱动有源蜂鸣器电路 采用PNP管驱动有源蜂鸣器电路 采用PNP管驱动无源蜂鸣器 采用NPN管驱动无源蜂鸣器 Proteus元器件列表 实例代码 /************************************************************************************* * 实验现象:下载程序

perseverance51博客 2万+

二分查找算法c语言_数据结构+算法(第11篇) 无死角“盘”它!二分查找树

点击上方“Java研发军团”,选择“置顶公众号”关键时刻,第一时间送达!阅读本文需要5分钟引言《菜鸟也能“种”好二叉树!》一文中提到了:为了方便查找,需要进行分层分类整理。而满足这种目标的数据结构之一就是树。树的叶子节点可以看作是最终要搜寻的目标物;叶子节点以上的每一层,都可以看作是一个大类别、层中的每个节点都可以看作是一个小类别。从上图可以看出,要定位目标物,就需要从最上面的大类依次向...

weixin_39867296的博客 132

自然语言处理之话题建模:BERTopic模型详解

BERTopic是一种基于BERT的先进话题建模技术,它结合了BERT的语义理解能力和非参数聚类算法HDBSCAN的灵活性,能够生成高质量、语义丰富的话题。与传统的LDA(Latent Dirichlet Allocation)话题模型相比,BERTopic能够更好地捕捉文本的复杂语义结构,因为它利用了预训练的BERT模型来嵌入文本,从而在话题建模中引入了深度学习的力量。聚类是无监督学习的一种,其目标是将数据集中的样本按照相似性进行分组,每个组称为一个“簇”。

zhubeibei168的博客 4538

二分查找树(BST)原理与实现详解

二叉搜索树(BST)作为基础数据结构,通过左小右大的节点排列规则实现O(log n)级别的查找效率。其核心原理是利用二分思想,每次比较可排除半数数据,这种分治策略在数据库索引、文件系统等场景有广泛应用。BST的标准实现包含查找、插入、删除三大操作,其中删除操作需要特别处理三种节点情况。为避免有序数据导致树退化为链表,工程中常采用AVL树、红黑树等平衡二叉树变种。在算法面试中,BST的遍历(前序/中序/后序)和层序遍历是高频考点,而实际开发时更推荐使用标准库实现的平衡树结构。

weixin_30770783的博客 298

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

d - 数据结构实验之查找四:二分查找_精通二分查找树

引言《菜鸟也能“种”好二叉树!》一文中提到了:为了方便查找,需要进行分层分类整理。而满足这种目标的数据结构之一就是树。树的叶子节点可以看作是最终要搜寻的目标物;叶子节点以上的每一层,都可以看作是一个大类别、层中的每个节点都可以看作是一个小类别。从上图可以看出,要定位目标物,就需要从最上面的大类依次向下定位目标物所属的小类。定位的效率(时间复杂度)取决于两个因素:非叶子节点的分岔数:分岔数越多,表示...

weixin_36303045的博客 146

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

[LeetCode]96 不同二分查找树

Unique Binary Search Trees(不同的二分查找树)【难度:Medium】 Given n, how many structurally unique BST’s (binary search trees) that store values 1…n?For example, Given n = 3, there are a total of 5 unique BST’s.

在这一路上寻找。 387

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

二分查找递归与非递归的时间比较_精通二分查找树

引言《菜鸟也能“种”好二叉树!》一文中提到了:为了方便查找,需要进行分层分类整理。而满足这种目标的数据结构之一就是树。树的叶子节点可以看作是最终要搜寻的目标物;叶子节点以上的每一层,都可以看作是一个大类别、层中的每个节点都可以看作是一个小类别。从上图可以看出,要定位目标物,就需要从最上面的大类依次向下定位目标物所属的小类。定位的效率(时间复杂度)取决于两个因素:非叶子节点的分岔数:分岔数越多,表示...

weixin_39714015的博客 505

数据结构+算法(第11篇) :无死角“盘”它!二分查找树

作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!一文中提到了:为了方便查找,需要进行分层分类整理。而满足这种目标的数据结构之一就是树。树的叶子节点可以看作是最终要搜寻的目标物;叶子节点以上的每一层,都可以看作是一个大类别、层中的每个节点都可以看作是一个小类别。从上图可以看出,要定位目标物,就需要从最上面的大类依次向下定位目标物所属的小类。

smart_an的专栏 1302

[LeetCode]95 不同二分查找树之二

Unique Binary Search Trees II(不同二分查找树之二)【难度:Medium】 Given n, generate all structurally unique BST’s (binary search trees) that store values 1…n.For example, Given n = 3, your program should return al

在这一路上寻找。 755

图解--二分查找树

一、定义 1.若它的左子树不为空,则左子树上所有结点的值均小于等于根结点的值; 2.若它的右子树不为空,则右子树上所有结点的值均大于等于根结点的值; 3.它的左右子树均为二分查找树。 二、图解实例 选取一个节点为参照根节点,会发现所有的左侧子节点小于等于参照点,右侧大于等于参照点。 比如根节点9, 9所有的左侧子节点(5、2、7、1、3)都小于等于9. 比如...

weixin_30950887的博客 263

排序列表转换为二分查找树

题目描述:给出一个所有元素以升序排序的单链表,将它转换成一棵高度平衡的二分查找树 我们之前做过一道将排序数组转换为二分查找树的问题,详见:点击打开链接 将链表转换为二分查找树与上面这道题的基本思想一模一样(在这里,高度平衡,也就是高度最小),所以我们要解决的问题就是查找到排序链表的中值,作为根节点,然后将链表分割,分别按照同样的思想生成左右子树。(如果对这个算法有疑问,请先搞懂我刚才给出的链接

guoziqing506的博客 2115

分布式算法Algorithms39:5大核心算法实现指南与集群应用场景

Algorithms39是一个全面的算法与数据结构集合,包含了多种适用于集群环境的核心算法实现。本文将深入解析其中5种关键算法的工作原理、实现路径及分布式场景下的应用方法,帮助开发者快速掌握集群环境下的算法应用技巧。 ## 1. Dinic网络流算法:分布式资源调度的核心引擎 网络流算法是分布式系统中资源分配与任务调度的基础工具。Algorithms39提供了高效的Dinic网络流实现,通过层

gitblog_00024的博客 580

判断给定的二叉树是否为二分查找树

笔试题: 判断给定的二叉树是否为二分查找树。假设树的每个节点都是以整数为键值,且不同节点值不相同。 返回结果:是二分查找树返回true,否则返回false。 输入: 5 5:2|1 2:-1|-1 1:-1|-15 5:2|8 2:-1|-1 8:-1|-1package com.hedx.test.Demo;import java.util.Scanner; import j

cqupt2010212062的博客 764

从根到叶:C语言实现树与二叉树的核心操作

摘要:本文系统讲解树与二叉树的核心概念(基本术语、性质、遍历),重点解析二叉排序树(BST) 的原理、操作(插入、删除)及C语言完整实现。涵盖基础理论到代码实战,助你夯实数据结构基础。

2503_92564287的博客 733
上一篇: 实用算法实践-第 4 篇 散列表
下一篇: 实用算法实现-第6篇 线段树
存储李希
博客等级 码龄15年 418粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值