用 C++ 标准模板库(STL)的 vector 实现二叉搜索树(BST)
本文由 Justme0翻译自 Code Project 转载请参见文章末尾处的要求。
介绍
众所周知,要建一棵树,我们需要关注它的内存分配与释放。为了避开这个问题,我打算用C++ STL(vector和deque)来建一棵小型的BST。很明显,这篇文章是出于这个想法的。
背景
BST是应用最广泛的数据结构之一。C是首选语言,不过因为C++尤其是C++11的出现,我更有兴趣用C++来实现。但是这篇文章里没有涉及到C++11,代码可用C++98来编译。
使用代码
要建BST,我们需要BST的数据结构。传统的BST数据结构包含指向左右子树的指针。我将用vector而不用指针,所以我将用vector的下标作为指向左右子树的指针。
struct bst
{
unsigned int data;
int leftIdx;
int rightIdx;
};
接下来,我会写各种建BST和它的孩子结点的函数。第一个函数用来建BST。它将用传入的数据来初始化数据结构,并且把左右下标置为-1(相当于置指针为NULL)。
void MakeNode(vector<struct> &v1, int aData)
{
struct bst b1 = { aData, -1, -1 };
v1.push_back(b1);
}
下面这个函数的功能是设置结点的左右孩子。设置时,会把左右孩子的真正下标(译者注:相当于它们的地址)赋到根结点上。
void setleft(vector <struct>&v1, int currIndex, int aData)
{
unsigned int leftIndex = v1.size();
v1[currIndex].leftIdx = leftIndex;
struct bst b1 = { aData, -1, -1 };
v1.push_back(b1);
} void setright(vector<struct> &v1, int currIndex, int aData)
{
unsigned int rightIndex = v1.size();
v1[currIndex].rightIdx = rightIndex;
struct bst b1 = { aData, -1, -1 };
v1.push_back(b1);
}
下面这个函数用于向BST插入数据。对所有结点(译者注:不应是“所有”,平均时间复杂度应是O(logn))遍历直至找到合适的位置插入元素,其中会调用上面定义的左右函数。
void Insert(vector<struct bst> &v1, int aData)
{
if(v1.size() == 0)
{
cout<<"Note is not made yet. MakeNode first..."<<endl;
return;
}
unsigned int currentIdx = 0;
while ( currentIdx < v1.size() )
{
if(aData <= v1[currentIdx].data)
{
if( v1[currentIdx].leftIdx == -1)
{
setleft(v1, currentIdx, aData);
break;
}
else
currentIdx = v1[currentIdx].leftIdx;
}
else
{
if(v1[currentIdx].rightIdx == -1)
{
setright(v1, currentIdx, aData);
break;
}
else
currentIdx = v1[currentIdx].rightIdx;
}
}
}
下面的代码将以前序、中序、后序遍历BST。下标参数是开始点。
void InTrav(vector <struct bst> &v1, unsigned int Idx)
{
if(v1[Idx].leftIdx != -1)
InTrav(v1,v1[Idx].leftIdx );
cout<<v1[Idx].data<<endl;
if( v1[Idx].rightIdx != -1)
InTrav(v1, v1[Idx].rightIdx);
} void PreTrav(vector <struct bst> &v1, unsigned int Idx)
{
cout<<v1[Idx].data<<endl;
if(v1[Idx].leftIdx != -1)
PreTrav(v1,v1[Idx].leftIdx );
if( v1[Idx].rightIdx != -1)
PreTrav(v1, v1[Idx].rightIdx);
}
void PostTrav(vector <struct bst> &v1, unsigned int Idx)
{
if(v1[Idx].leftIdx != -1)
PostTrav(v1,v1[Idx].leftIdx );
if( v1[Idx].rightIdx != -1)
PostTrav(v1, v1[Idx].rightIdx);
cout<<v1[Idx].data<<endl;
}
主程序比较简单,如下
int main()
{
vector <struct bst> v1;
MakeNode(v1, 30);
Insert(v1, 20);
Insert(v1, 6);
Insert(v1, 40);
Insert(v1, 35);
Insert(v1, 16);
Insert(v1, 7); InTrav(v1, 0);
PreTrav(v1,0);
PostTrav(v1,0);
return 0;
}
兴趣点
1、同样的代码也可用于STL deque。我还没为任何其他容器测试。
2、与原生指针比起来,效率较低,除非做一些vector(STL)优化。我还没去尝试。
3、你可以用它来建小型的BST,可以一下子删除它而不用担心内存释放。
4、对于BST的删除元素操作,我会在下一篇帖子中介绍。
历史
第一篇帖子
许可证
本文及相关源代码、文件,由代码项目开放许可证(CPOL)授权。
关于作者
架构师
印度
我热爱编程,甚至在我接受专业教育之前就开始了(1995年)。从那以后,我一直从事于IP网络栈(写IPv6栈和下一代TCP栈),VoIP,IP安全(IKE/IPSec)。
我最热衷的编程语言是C++,喜欢研究用加强的算法和数据结构来提高基于人工智能的系统。
原文链接:Code Project 翻译:Justme0 (@Just_me0)
译文链接:http://blog.csdn.net/justme0/article/details/11161191
[ 转载必须在正文中标注并保留原文链接、译文链接和译者等信息。]
用 C++ 标准模板库(STL)的 vector 实现二叉搜索树(BST)的更多相关文章
- 标准模板库(STL)学习探究之vector容器
标准模板库(STL)学习探究之vector容器 C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...
- C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用
摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解.即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第一篇,主要针对线性表中的顺序表(动 ...
- C++ 标准模板库(STL)
C++ 标准模板库(STL)C++ STL (Standard Template Library标准模板库) 是通用类模板和算法的集合,它提供给程序员一些标准的数据结构的实现如 queues(队列), ...
- STL学习系列之一——标准模板库STL介绍
库是一系列程序组件的集合,他们可以在不同的程序中重复使用.C++语言按照传统的习惯,提供了由各种各样的函数组成的库,用于完成诸如输入/输出.数学计算等功能. 1. STL介绍 标准模板库STL是当今每 ...
- 标准模板库--STL
标准模板库STL 1.泛型程序设计 C++ 语言的核心优势之一就是便于软件的重用 C++中有两个方面体现重用: 1.面向对象的思想:继承和多态,标准类库 2.泛型程序设计(generic progra ...
- C++的标准模板库STL中实现的数据结构之链表std::list的分析与使用
摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解,即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第二篇.主要针对线性表中的链表 ST ...
- 标准模板库(STL)学习探究之stack
标准模板库(STL)学习探究之stack queue priority_queue list map/multimap dequeue string
- 实验8 标准模板库STL
一.实验目的与要求: 了解标准模板库STL中的容器.迭代器.函数对象和算法等基本概念. 掌握STL,并能应用STL解决实际问题. 二.实验过程: 完成实验8标准模板库STL中练习题,见:http:// ...
- C++ 标准模板库STL 队列 queue 使用方法与应用介绍
C++ 标准模板库STL 队列 queue 使用方法与应用介绍 queue queue模板类的定义在<queue>头文件中. 与stack模板类很相似,queue模板类也需要两个模板参数, ...
- 【c++】标准模板库STL入门简介与常见用法
一.STL简介 1.什么是STL STL(Standard Template Library)标准模板库,主要由容器.迭代器.算法.函数对象.内存分配器和适配器六大部分组成.STL已是标准C++的一部 ...
随机推荐
- C# / MSSQL / WinForm / ASP.NET - SQLHelper中返回SqlDataReader数据
/// <summary> /// Execute a SqlCommand that returns a resultset against the database specified ...
- UC网盘被关停 将与阿里淘盘合并?(案例说明云盘的成本才是重点,技术不是问题;与巨头竞争是重点)
UC网盘被关停 将与阿里淘盘合并? 二八2016-03-18 08:05:36阿里巴巴 网盘 产品阅读(0)评论(12) UC网盘项目组日前发布公告称将停止网盘存储服务,原因为配合国家对云盘传播淫秽色 ...
- <1> perl概述
[root@wx03 1]# cat a1.pl $arr=[1,2,3,4,5,6]; print $arr->[4]."\n"; $hash={a=>1,b=> ...
- Android Folding View(折叠视图、控件)
版本号:1.0 日期:2014.4.21 版权:© 2014 kince 转载注明出处 非常早之前看过有人求助以下这个效果是怎样实现的, 也就是側滑菜单的一个折叠效果,事实上关于这个效果的实现,谷 ...
- Android 仿 窗帘效果 和 登录界面拖动效果 (Scroller类的应用) 附 2个DEMO及源码
在android学习中,动作交互是软件中重要的一部分,其中的Scroller就是提供了拖动效果的类,在网上,比如说一些Launcher实现滑屏都可以通过这个类去实现.下面要说的就是上次Scroller ...
- 怎样改动Myeclipse10.7的Servlet模板
(1)在myeclipse10.0曾经的版本号中咱庄文件夹仅仅有叶仅仅需找到plugins在文件夹下找到: com.genuitec.eclipse.wizards_9.0.0.me201211011 ...
- [知识库分享系列] 二、Web(高性能Web站点建设)
知识库分享系列: [知识库分享系列] 二..NET(ASP.NET) [知识库分享系列] 一.开篇 分享介绍 此知识库之所以为 Web 系列,因为和 .NET 没有完全的关系,其中的技术和实践实用于各 ...
- 关于ListCtrol自绘的技巧
一.给控件添加排序功能report风格的list控件很多情况下都需要支持排序功能,而且最好支持按不同列进行排序.CListCtrl的类方法SortItems支持排序功能,但是在排序过程中,两个数据真正 ...
- drupal进入不了后台时候的解决办法,作者使用drush方案,已验证
drupal把正在用的主题不小心删了,怎么进后台? 方法一: 去variable表里把默认主题换了 方法二: ?q=user 登录到管理区,开启简洁连接使用user(网站根目录下面) admin/ap ...
- 使用ANR-WatchDog来检測ANR
使用开源项目ANR-WatchDog来检測ANR.下载链接为:https://github.com/SalomonBrys/ANR-WatchDog Eclipse版本号仅仅需下载相应的jar包.在主 ...