搜索树数据结构支持很多动态集合操作,如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、待续。

最新文章

  1. 基于eBox旋转编码器
  2. Java并发和多线程(二)Executor框架
  3. 《30天自制操作系统》17_day_学习笔记
  4. RSA 加密
  5. ASP.NET、WinForm、C# - 配置文件信息读取 [ Web.config || Appconfig ]
  6. 内存管理之slab分配器
  7. mybatis if test 解决页面 升序和降序的问题
  8. javascript编码规范总结
  9. web安全:QQ号快速登录漏洞及被盗原理
  10. 牛客网PAT乙级(Basic Level)真题-数字分类 (20)
  11. maven的安装和配置
  12. DTW的原理及matlab实现(转载+整理)
  13. CSS导航条nav简单样式
  14. VS2010发布、打包安装程序(超全超详细)
  15. vue-循环标记列表元素
  16. &lt;Linux&gt; SSH配置之后 SHH slave1 测试 error:SSH: command not found
  17. java基础篇---Servlet监听器
  18. RSA加密常用的填充方式 以及 常见错误
  19. 关于nodejs中遇到mysql默认8小时连接断开机制的终极简单解决方案
  20. java.lang.IllegalArgumentException: XML fragments parsed from previous mappers does not contain value for

热门文章

  1. VMware HA 特性
  2. js函数形参和实参的区别
  3. git的回退和撤销操作
  4. python的资源整合
  5. mysql 连接失败问题汇集
  6. MFC does not support WINVER less than 0x0501 解决方案(转)
  7. 我读过的最好的epoll讲解--转自”知乎“ 【转】
  8. 資料視覺化:使用Python與JavaScript 简介和目录
  9. nginx+lua_module安装
  10. electron 安装使用