搜索树数据结构支持很多动态集合操作,如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. TCP面试题之四次挥手过程

    TCP四次挥手过程: 1.第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态: 2.第二次挥手:Server收到FIN后,发 ...

  2. HTTP Basic 机制

    package com.enation.app.shop.component.payment.plugin.cod; import java.io.IOException; import java.u ...

  3. elemetUi 组件--el-checkbox

    [需求]实现选择右边的

  4. 母函数(Generation Function) 入门 + 模板

    转自:母函数 入门 + 模板  感谢 在数学中,某个序列的母函数(Generating function,又称生成函数)是一种形式幂级数,其每一项的系数可以提供关于这个序列的信息.使用母函数解决问题的 ...

  5. python的资源整合

    一位大牛整理的Python资源 Python基本安装: * http://www.python.org/ 官方标准Python开发包和支持环境,同时也是Python的官方网站:* http://www ...

  6. Android多线程全面解析:IntentService用法&源码

    前言 多线程的应用在Android开发中是非常常见的,常用方法主要有: 继承Thread类 实现Runnable接口 AsyncTask Handler HandlerThread IntentSer ...

  7. JavaEE中Filter实现用户登录拦截

    实现思路是编写过滤器,如果用户登录之后session中会存一个user.如果未登录就为null,就可以通过过滤器将用户重定向到登陆页面,让用户进行登陆,当然过滤器得判断用户访问的如果是登陆请求需要放行 ...

  8. ios 改变图片大小缩放方法

    http://www.cnblogs.com/zhangdadi/archive/2012/11/17/2774919.html http://bbs.csdn.net/topics/39089858 ...

  9. 掌握 Linux 调试技术【转】

    转自:https://www.ibm.com/developerworks/cn/linux/sdk/l-debug/index.html 您可以用各种方法来监控运行着的用户空间程序:可以为其运行调试 ...

  10. java基础练习 14

    import java.util.Scanner; public class Fourtheen { /*打印出所有的"水仙花数",所谓"水仙花数"是指一个三位 ...