用 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++的一部 ...
随机推荐
- VS2008下直接安装使用Boost库1.46.1版本
Boost库是一个可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一. Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容.在C++ ...
- poj 1564 Sum It Up | zoj 1711 | hdu 1548 (dfs + 剪枝 or 判重)
Sum It Up Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Sub ...
- 2014/08/24——升级stepbystep修复tc不刷新问题并加入杭电bc
问题: 自从tc站点升级以后做题统计的tc一栏就不刷新了,为此全哥也更新了一下stepbystep的配置文件什么的,我仅仅要将其挂到server上即可了. 由于加了杭电的bc,看来这事儿不easy.还 ...
- ASP.NET - 匹配标签中的内容
string str = @"<td>Csdn</td>\r\n<td>V1.0</td>\r\n<td>2014-10-23&l ...
- sql: 查询,select
快速查询数据库中拥有那些表项:(类似linux中的ls, ls |grep table_name*)select * from tab where tname like 'YOUR_QERYNAME% ...
- asp.net下用js实现弹出子窗口选定值并返回
对应上一篇博客代码: 父页面: <head runat="server"> <meta http-equiv="X-UA-Compatible" ...
- 基于visual Studio2013解决C语言竞赛题之1052求根
题目 解决代码及点评 /* 功能:用简单迭代法解方程 e^x - x - 2 = 0 它有两个根(如图),其迭代公式为: 1) x[n+1]= e^x*n-2 (初值X<0时) ...
- javascript 中对this关键字的一些理解
var self = this 可能会觉得奇怪为什么我会定义一个_self的变量, 因为在js里,this不用对于其他的对象语言,他的解析过程与运行过程中this会改变的.这里简单说说js里this的 ...
- WEB服务器、应用程序服务器区别
WEB服务器.应用程序服务器.HTTP服务器有何区别?IIS.Apache.Tomcat.Weblogic.WebSphere都各属于哪种服务器,这些问题困惑了很久,今天终于梳理清楚了: Web服务器 ...
- appium 真机测试问题 出现 instruments crashed on startup
1.appium 真机测试的时候 instruments crashed on startup,必须在真机上打开UI Automation 在设置里: Developer->Enable UI ...