搜索树数据结构支持很多动态集合操作,如search(查找)、minmum(最小元素)、maxmum(最大元素)、predecessor(前驱)、successor(后继)、insert(插入)、delete(删除)。这些都是基本操作,能够使用一颗搜索树当做一个字典或者一个优先队列。

12.1、什么事二叉搜索树

二叉搜索树是以一棵二叉树来组织的,能够用一个链表数据结构来表示,也叫二叉排序树、二叉查找树。

当中的每一个结点都是一个对象,每一个对象含有多个属性(key:该结点代表的值大小。卫星数据:不清楚,left:左孩子结点,right:右孩子结点,p:双亲,貌似是单亲)。

假设某个孩子结点和父结点不存在,则对应属性值为NULL;

根结点是树中唯一父指针为NULL的结点。

二叉搜索树的性质:

设x是二叉搜索树中的一个结点。若y是x左子树中的一个结点,则y.key <= x.key;若y是x右子树中的一个结点,则y.key >= x.key;

通俗讲就是二叉搜索树中的随意一个结点的做孩子结点值不大于该结点,右孩子结点的值不小于改结点。

二叉搜索树的keyword都是依照二叉搜索树性质的方式存储的。即仅仅要一个数是二叉搜索树,则必须满足上述性质。

不同的二叉搜索树能够代表同一组值的集合。

二叉搜索树的性质同意我们通过一个简单递归算法来按序输出二叉搜索树中的全部keyword(遍历时,从根结点開始遍历),依据递归时子树根的keyword与其左右子树keyword输出顺序的不同,分三种便利方式:

若递归遍历时输出的子树根的keyword位于其左子树的keyword和右子树的关键之间,则称为中序遍历。

若递归遍历时输出的子树根的keyword位于其左子树的keyword和右子树的关键之前,则称为先序遍历。

若递归遍历时输出的子树根的keyword位于其左子树的keyword和右子树的关键之后。则称为后序遍历。

中序遍历的简单递归过程为:

middleOrder (x){

if(x != null)

middleOrder (x.left);

print x.key;

middleOrder (x.right);

}

先序遍历的简单递归过程为:

preOrder (x){

if(x != null)

print x.key;

preOrder (x.left);

preOrder (x.right);

}

中序遍历的简单递归过程为:

afterOrder (x){

if(x != null)

afterOrder (x.left);

afterOrder (x.right);

print x.key;

}

举比例如以下图:

中序遍历分析:

1、依据中序递归的运行过程。可推断从最左下方開始输出。2,5(6的左孩子的keyword,此时为子树根),5,这三个数各自是左孩子,子树根。右孩子,依照中序遍历的定义,则输出顺序为2、5(子树根)、5(右孩子)

2、5、6、7三个类似。输出5、6、7

3、7无左孩子。则直接输出7、8

最后结果为:2、5(6的左孩子的keyword)、5(6的左孩子的右孩子)、6、7、8

先序遍历方式为:依据先序递归的过程,先输出子树根结点。再递归遍历其左子树和右子树结点,结果为:6、5(6的左孩子)、2、5(6的左孩子的右孩子)、7、8

后序遍历方式为:依据后序递归的过程,先输出子树根的左右结点,再输出子树根结点,结果为:2、5(6的左孩子的右孩子)、5、5(6的左孩子)、8、7、6

关键点:可想象递归程序的运行过程,来推断输出结果。

定理:假设x是一棵有n个结点子树的根,那么调用middleOrder(x)须要Θ(n)时间,同理preOrder和afterOrder也是Θ(n)时间。

定理分析:证明该递归算法须要Θ(n)时间,则须要证明Ω(n)<=T(n)<=Ο(n)

遍历单个结点时间如果为常量,则由于须要遍历n个结点,所以T(n)>= Ω(n)。即最少须要时间为n的线性函数,系数和常数项省略,Ω简单说表示所需时间的下界。

T(n)<=Ο(n)证明省略。

练习:

12.1-1 对于keyword集合{1、4、5、10、16、17、21},分别画出高度为2、3、4、5、6的二叉搜索树。

分析:例如以下图:

2、待续。

算法导论(Introduction to Algorithms )— 第十二章 二叉搜索树— 12.1 什么是二叉搜索树的更多相关文章

  1. 《算法导论》学习总结 — XX.第23章 最小生成树

    一.什么叫最小生成树 一个无向连通图G=(V,E),最小生成树就是联结所有顶点的边的权值和最小时的子图T,此时T无回路且连接所有的顶点,所以它必须是棵树. 二.为什么要研究最小生成树问题 <算法 ...

  2. 《算法导论》学习总结 — XX.第22章 图的基本算法

    BFS(广搜): 广搜就是广度优先搜索,根据名字可以知道,是通过广度来遍历图,也就是层次遍历吧. 在这里以及下面的DFS(深搜),都用到了颜色WHITE,GRAY,BLACK,不过作用不同,具体分别再 ...

  3. 算法导论 第十章 基本数据类型 & 第十一章 散列表(python)

    更多的理论细节可以用<数据结构>严蔚敏 看几遍,数据结构很重要是实现算法的很大一部分 下面主要谈谈python怎么实现 10.1 栈和队列 栈:后进先出LIFO 队列:先进先出FIFO p ...

  4. 算法导论第十八章 B树

    一.高级数据结构 本章以后到第21章(并查集)隶属于高级数据结构的内容.前面还留了两章:贪心算法和摊还分析,打算后面再来补充.之前的章节讨论的支持动态数据集上的操作,如查找.插入.删除等都是基于简单的 ...

  5. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十二章:四元数(QUATERNIONS)

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十二章:四元数(QUATERNIONS) 学习目标 回顾复数,以及 ...

  6. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十二章:几何着色器(The Geometry Shader)

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十二章:几何着色器(The Geometry Shader) 代码工 ...

  7. C++实现二叉搜索书(参考算法导论)

    1 #include <iostream> 2 using namespace std; 3 4 struct node 5 { 6 // 数据域 7 int data; 8 9 // 左 ...

  8. MIT算法导论——第五讲.Linear Time Sort

    本栏目(Algorithms)下MIT算法导论专题是个人对网易公开课MIT算法导论的学习心得与笔记.所有内容均来自MIT公开课Introduction to Algorithms中Charles E. ...

  9. MIT算法导论——第二讲.Solving Recurrence

    本栏目(Algorithms)下MIT算法导论专题是个人对网易公开课MIT算法导论的学习心得与笔记.所有内容均来自MIT公开课Introduction to Algorithms中Charles E. ...

随机推荐

  1. BZOJ 2103/3302/2447 消防站 树的重心【DFS】【TreeDP】

    2103: Fire 消防站 Time Limit: 30 Sec  Memory Limit: 259 MBSubmit: 157  Solved: 116[Submit][Status][Disc ...

  2. windows批处理命令学习

    初入批处理的学习,发现运行window的系统命令会减少很多的劳动,很方便. 参考例子: http://www.jb51.net/article/41322.htm

  3. centos 搭建web平台

    centos 查询是否安装apacherpm -qa httpd 出现类似 httpd--.el6.centos..x86_64 ,说明已安装 yum -y install httpd    // 安 ...

  4. OpenCV 2.4.9 学习笔记(4)—— 像素类型与Templates的限制使用

    限制使用templates C++中的Templates使得接口机制非常好用,高效而且能够保证数据与算法的安全.但是过多地使用templates可能会增加计算时间和代码长度,有时候还能难区分接口和实现 ...

  5. flexigrid 学习总结

    最近看到了一款flexigrid表格组件,简单美观,在下载使用的过程中,发现缺少很多功能.<基于jQuery的GridView-Flexigrid(2)-扩展和修复>给我带来了很大的帮助, ...

  6. C语言高级应用---操作linux下V4L2摄像头应用程序【转】

    转自:http://blog.csdn.net/morixinguan/article/details/51001713 版权声明:本文为博主原创文章,如有需要,请注明转载地址:http://blog ...

  7. AC日记——玻璃切割 51nod 1562

    玻璃切割 思路: 并查集: 离线操作: 先把每次切割都存下来: 然后从后面不断合并切割: 然后每次更新最大长和宽: 记录答案: 要开longlong: 来,上代码 #include <cstdi ...

  8. DotNetCore 笔记

    最近公司框架升级到DotNetCore了,但是在用post请求的时候,发现页面的post data后台并没有接收到数据,经过调查发现,netcore用法和之前的MVC5不一样,想要接收post里的da ...

  9. BZOJ 4589 Hard Nim(FWT加速DP)

    题目链接  Hard Nim 设$f[i][j]$表示前$i$个数结束后异或和为$j$的方案数 那么$f[i][j] = f[i-1][j$ $\hat{}$ $k]$,满足$k$为不大于$m$的质数 ...

  10. [USACO17DEC] Barn Painting

    题目描述 Farmer John has a large farm with NN barns (1 \le N \le 10^51≤N≤105 ), some of which are alread ...