0

0

C++中的二叉堆和二叉搜索树

王林

王林

发布时间:2023-08-22 16:10:59

|

1717人浏览过

|

来源于php中文网

原创

c++中的二叉堆和二叉搜索树

在C++编程中,二叉堆和二叉搜索树是两种常用的数据结构,它们具有相似之处,但是也有着不同点。本文将分别介绍二叉堆和二叉搜索树的概念、基本操作及其应用场景。

一、 二叉堆

1.1 概念

二叉堆是一种完全二叉树,满足以下两种性质:

立即学习C++免费学习笔记(深入)”;

1.1.1 堆序性

堆序性指在一个二叉堆中,每个节点的值都不大于(或不小于)其父节点的值。这里以最大堆为例,即根节点的值是整个树中最大的值,而所有子节点的值都小于等于根节点的值。

1.1.2 完全二叉树性质

除了最底层之外,其他层都必须填满,且所有节点都必须向左对齐。

这里以如下的数组来表示一个最大堆:

[ 16, 14, 10, 8, 7, 9, 3, 2, 4 , 1 ]

则其对应的堆如下图所示:

16

/
14 10
/ /
8 7 9 3
/
2 4

1

1.2 基本操作

1.2.1 插入操作

在一个二叉堆中插入一个新元素的操作,采用“上滤”(sift up)的方法进行调整:

  • 将新元素插入到堆底最左边的空位;
  • 将新元素和它的父节点进行比较,如果新元素的值比其父节点大,则交换两者的位置,重复此过程直到新元素不再比其父节点大,或到达堆顶。

1.2.2 删除操作

在一个二叉堆中删除堆顶元素的操作,采用“下滤”(sift down)的方法进行调整:

  • 将堆顶元素和堆底最右边的元素互换;
  • 删除原来的堆顶元素;
  • 将新的堆顶元素逐层与其子节点进行比较,如果它的值小于子节点中的最大值,则将它与子节点中的最大值进行交换,重复此过程直到满足堆序性。

1.3 应用场景

二叉堆常用来实现优先队列,以及基于堆的排序算法,如堆排序、topK问题等。

二、 二叉搜索树

2.1 概念

二叉搜索树(Binary Search Tree,BST)是一种有序树,满足以下性质:

2.1.1 左子树上所有节点的值均小于它的根节点的值。

2.1.2 右子树上所有节点的值均大于它的根节点的值。

2.1.3 左、右子树也分别为二叉搜索树。

以如下树为例:

    6
  /   
 2     7

/
1 4 9

知了追踪
知了追踪

AI智能信息助手,智能追踪你的兴趣资讯

下载
   /    /
  3   5 8

则它是一棵二叉搜索树。

2.2 基本操作

2.2.1 查找操作

在二叉搜索树中查找一个节点的操作,其实质就是不断地比较要查找的节点值与当前节点值的大小,并沿着左/右子树递归查找。

2.2.2 插入操作

在二叉搜索树中插入一个新节点的操作,需要从根节点开始进行比较,并找到其应该插入的位置,插入后需要满足二叉搜索树的性质。

2.2.3 删除操作

在二叉搜索树中删除一个节点的操作,分三种情况:

  • 要删除的节点是叶子节点,直接删除即可;
  • 要删除的节点只有一个子节点时,用它的子节点替换该节点;
  • 要删除的节点有两个子节点时,用该节点右子树的最小节点代替该节点,并将该节点右子树的最小节点删除。

2.3 应用场景

二叉搜索树常用来实现字典、符号表等具有查找和插入操作的场景,其中的查找性能与数据的分布情况有关。

三、 二叉堆和二叉搜索树的比较

3.1 相似之处

二叉堆和二叉搜索树均是二叉树,具有一些相同的性质:

  • 根节点的初始位置均可以是任意节点;
  • 都可以用来实现优先队列;
  • 插入和删除的时间复杂度均为O(logn)。

3.2 不同之处

二叉堆和二叉搜索树之间也有一些明显的不同点:

3.2.1 数据分布

在二叉堆中,元素没有任何规律地分布在各个节点中,只需保证每个节点都满足堆序性即可;而在二叉搜索树中,元素的大小有特定的排序规则,即满足左小右大的性质。

3.2.2 最小/最大值的访问

在二叉堆中,可以O(1)地访问到最大/最小值,即在根节点中得到,但是访问其他元素的时间复杂度为O(logn);而在二叉搜索树中,查找最小/最大值需要遍历子树,时间复杂度也为O(logn)。

3.2.3 删除和插入操作

在二叉堆中,每次删除和插入操作都必须遵循堆序性,即O(logn)的时间复杂度;而在二叉搜索树中,查找一个节点和插入一个新节点的时间复杂度与树的高度相关,因此最坏情况下可能需要O(n)的时间复杂度。

3.3 选型建议

在选择二叉堆和二叉搜索树时,需要根据应用场景的具体情况进行选择。

如果需要快速地获取最小/最大值,并且对元素的大小没有特殊要求,可以优先选择二叉堆。

如果需要快速地插入/删除元素,并且需要元素的大小有一定的排序规律,可以考虑选择二叉搜索树。

四、 结论

综上所述,二叉堆和二叉搜索树都是比较重要的数据结构,在不同的场景下有着各自的优缺点。了解二叉堆和二叉搜索树的概念、基本操作及其应用场景对于编写高效的程序具有重要的意义。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

3

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

1

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

5

2025.12.31

不受国内限制的浏览器大全
不受国内限制的浏览器大全

想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

7

2025.12.31

出现404解决方法大全
出现404解决方法大全

本专题整合了404错误解决方法大全,阅读专题下面的文章了解更多详细内容。

30

2025.12.31

html5怎么播放视频
html5怎么播放视频

想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

3

2025.12.31

关闭win10系统自动更新教程大全
关闭win10系统自动更新教程大全

本专题整合了关闭win10系统自动更新教程大全,阅读专题下面的文章了解更多详细内容。

2

2025.12.31

阻止电脑自动安装软件教程
阻止电脑自动安装软件教程

本专题整合了阻止电脑自动安装软件教程,阅读专题下面的文章了解更多详细教程。

3

2025.12.31

html5怎么使用
html5怎么使用

想快速上手HTML5开发?本合集为你整理最实用的HTML5使用指南!涵盖HTML5基础语法、主流框架(如Bootstrap、Vue、React)集成方法,以及无需安装、直接在线编辑运行的平台推荐(如CodePen、JSFiddle)。无论你是新手还是进阶开发者,都能轻松掌握HTML5网页制作、响应式布局与交互功能开发,零配置开启高效前端编程之旅!

2

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 5.7万人学习

C 教程
C 教程

共75课时 | 3.8万人学习

C++教程
C++教程

共115课时 | 10.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号