搜索树数据结构支持很多动态集合操作,如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. HDU1710---树(知前序遍历与中序遍历 求后序遍历)

    知前序遍历与中序遍历 求后序遍历 #include<iostream> #include<cstring> #include<queue> #include< ...

  2. Java中Collections的binarySearch方法

    方法一 public static <T> int binarySearch(List<? extends Comparable<? super T>> list, ...

  3. [LeetCode] Combinations 回溯

    Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For exampl ...

  4. 1.1 由C++Builder 6.0 通向OpenGL(1)

    http://book.51cto.com/art/201104/255588.htm 第1章  架好通向OpenGL的桥 本章主要是为以后进行的OpenGL编程进行一些铺垫工作.主要内容有:Open ...

  5. 《Linux命令、编辑器与shell编程》第三版 学习笔记---003 使用multibootusb

    1.下载文件https://codeload.github.com/mbusb/multibootusb-8.9.0.tar.gz,使用命令: tar xvf multibootusb-8.9.0.t ...

  6. Windows下VS2013创建与使用动态链接库(.dll)

    一.创建动态链接库文件 ** 1.打开VS2013,选择文件,新建工程  2.选择新建W32控制台应用程序,这里将工程名改为makeDLL  3.在应用程序类型中选择DLL,点击完成  4.完成以上步 ...

  7. POCO库中文编程参考指南(6)Poco::Timestamp

    1 类型别名 三个时间戳相关的类型别名,TimeDiff表示两个时间戳的差,第二个是以微秒为单位的时间戳,第三个是以 100 纳秒(0.1 微妙)为单位的时间戳: typedef Int64 Time ...

  8. ObjectInputStream&ObjectOutputStream工具类

    序列化:将数据保存到文件:ObjectOutputStream; 反序列化:将文件中的数据显示出来:ObjectInputStream;   在反序列化程序中运行后能够正常输出Person的相关信息, ...

  9. python 操作数据库1--连接、执行sql语句

    #!/usr/bin/env python # -*- coding:utf-8 -*- # @Time : 2017/11/20 16:03 # @Author : lijunjiang # @Fi ...

  10. net页面生命周期

    ASP.NET 页运行时,此页将经历一个生命周期,在生命周期中将执行一系列处理步骤.这些步骤包括初始化.实例化控件.还原和维护状态.运行事件处理程序代码以及进行呈现.了解页的生命周期非常重要,这样就能 ...