二叉搜索树

总结

1.查找二叉搜索树中最大关键字元素

TREE-MAXIMUM(x)while x.right!=NILx=x.rightreturn x

2.查找二叉搜索树中最小关键字元素

TREE-MINIMUM(x)while x.left!=NILx=x.leftreturn x

3.插入一个结点到二叉树

TREE-INSERT(T,z)y=NIL  //y结点的作用是保存找到的z的双亲结点x=T.root  //从根结点开始向下寻找while x!=NILy=xif z.key<x.keyx=x.leftelsex=x.rightz.p=yif y==NIL  //向空树中插入一个结点z的情况T.root=zelse if z.key<y.key  //虽然找到了z的双亲结点y,但是不知道z是y的左孩子还是右孩子,还需做出判断y.left=zelsey.right=z

4.二叉搜索树后继结点的查找

一个结点的后继是大于x.key的最小关键字的结点(结点3的后继为8)

TREE-SUCCESSOR(x)if x.right!=NIL  //如果结点x的右子树不为空,那么x的后继就是x右子树中的最左结点return TREE-MINIMUM(X.right)else  //如果x的右子树为空,为了找到后继结点y,需要从x开始沿树而上遇到这样一个结点:这个结点是它双亲的左孩子y=x.pwhile y!=NIL and x==y.rightx=yy=y.preturn y

5.删除二叉搜索树中的一个结点

子过程TRANSPLANT是用另一颗子树替换一颗子树并成为其双亲的孩子结点
TRANSPLANT(T,u,v)if u.p==NIL  //u是树根,则替换后v就是树根T.root=velse if u=u.p.leftu.p.left=v  //如果u是双亲的左孩子,则v代替u成为u双亲的左孩子elseu.p.right=v  //如果u是双亲的右孩子,则v代替u成为u双亲的右孩子if v!=NIL  //v其实可以为空v.p=u.p

注意:上述TRANSPLANT没有处理v.left和v.right的更新,这也就是说,用子树v替换完u之后,v.left和v.right的更新要由TRANSPLANT的调用者负责。

TREE-DELETE(T,z)if z.left==NIL  //结点z没有左孩子,则直接用结点z的右孩子这棵子树对z这棵子树进行替换TRANSPLANT(T,z,z.right)else if z.right==NIL  //结点z没有左孩子,则直接用结点z的右孩子这棵子树对z这棵子树进行替换TRANSPLANT(T,z,z.left)else y=TREE-MINIMUM(z.right)  //结点的左右孩子均存在,通过调用TREE-MINIMUM(查找比给定结点大的最小结点也就是后继结点)查找结点z的后继y,用它来替代z  if y.p!=z  //如果找到的y不是z的孩子结点,则y结点必然没有左孩子(否则y就不是z的后继结点)。TRANSPLANT(T,y,y.right)  //先用y的右孩子这棵子树替代y子树y.right=z.right  //此时,将z的右孩子赋予y的右孩子y.right.p=y   TRANSPLANT(T,z,y)  //如果找到的y是z的孩子结点,则子树y对子树z进行替换。否则,用更新后的子树y对子树z进行替换y.left=z.left  //y的孩子的更新y.left.p=y

课后题答案

12.1-2 二叉搜索树性质与最小堆性质之间有什么不同?

1.二叉排序树是为了实现动态查找而设计的数据结构,它是面向查找操作的,在二叉排序树中查找一个结点的平均时间复杂度是O(log n);
堆是为了实现排序而设计的一种数据结构,它不是面向查找操作的,因而在堆中查找一个结点需要进行遍历,其平均时间复杂度是O(n)。

2.在二叉排序树中,某结点的右孩子结点的值一定大于该结点的左孩子结点的值;

在堆中却不一定,堆只是限定了某结点的值大于(或小于)其左右孩子结点的值,但没有限定左右孩子结点之间的大小关系。

3.具有n个结点的二叉排序树,其深度取决于给定集合的初始排列顺序,最好情况下其深度为lgn,最坏情况下其深度为n;

具有n个结点的堆,其深度为lgn 。

12.1-3 设计一个执行中序遍历的非递归算法。

INORDER-TREE-WALK(x)node=rootwhile node!=NIL || !stack.empty()if node!=NILpush(node)node=node.left  //从根结点开始,先将左孩子入栈else  node=top()  //左孩子为空时,对栈顶元素进行出栈visit(node)  //读取node的关键字node=node.right  //转到出栈元素的右孩子

12.2-3 写出过程TREE-PREDECESSOR的伪代码。

TREE-PREDECESSOR(x)if x.left!=NIL  //如果结点x的左子树不为空,那么x的后继就是x左子树中的最右结点return TREE-MAXIMUM(x.left)else  //如果x的左子树为空,为了找到前驱结点y,需要从x开始沿树而上遇到这样一个结点:这个结点是它双亲的右孩子y=x.pwhile y!=NIL and x==y.leftx=yy=y.preturn y

12.3-1 给出TREE-INSERT过程的一个递归版本。

RECURSIVE-INSERT(x,z)  //以x结点为树根的树中插入结点zif z.key<x.key and x.left!=NILRECURSIVE-INSERT(x.left,z)if z.key>x.key and x.right!=NILRECURSIVE-INSERT(x.right,z)z.parent=xif z.key<x.keyx.left=zelsex.right=z

算法导论第十二章总结以及课后题答案相关推荐

  1. 算法导论第十二章:二叉查找树

    查找树是一种数据结构,它支持多种动态集合操作,包括search, minimum, maximum, predecessor, successor, insert以及delete.他既可以用作字典,也 ...

  2. C语言谭浩强第三版第十二章例题及课后题:位运算

    eg12.1取一个整数a从右端开始的4~7位 0000...000000        0 1111...111111       ~0  1111...110000       ~0<< ...

  3. 【Java数据结构与算法】第十二章 哈夫曼树和哈夫曼编码

    第十二章 哈夫曼树和哈夫曼编码 文章目录 第十二章 哈夫曼树和哈夫曼编码 一.哈夫曼树 1.基本术语 2.构建思路 3.代码实现 三.哈夫曼编码 1.引入 2.介绍 3.代码实现哈夫曼编码综合案例 一 ...

  4. 算法导论第十五章:动态规划(一)

    前言:最近一直在刷leetcode,虽然经常遇到动态规划的问题,但是常常还是留下没有知识的泪水 练习解答链接:https://ita.skanev.com/

  5. July博客第十二章参考学习

    ### July博客第十二章参考学习 ## 第一题:给40亿个不重复的unsigned int 的整数,无序,给一个随机数,快速判断这个是否在40亿个数当中 1. 个人思路: - bitmap,重点在 ...

  6. 统计学怎么求加权指数_暨南大学《统计学》中文习题 第十二章 统计指数

    第十二章 统计指数 (一)判断题 1. 狭义指数是指反映社会经济现象变动与差异程度的相对数.( ) 是: 否: 2. 广义上说,任何两个不同时间的同类指标的对比都可称为指数.( ) 是: 否: 3. ...

  7. 数字图像处理:第十二章 小波变换

    第十二章 小波变换 目录 1         引言 2         连续小波变换 3         二进小波变换 3.1      Haar变换 4         离散小波变换 4.1     ...

  8. 程序员编程艺术第一 二十二章集锦与总结(教你如何编程)

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 程序员编 ...

  9. 程序员编程艺术第一~二十二章集锦与总结(教你如何编程)

    程序员编程艺术第一~二十二章集锦与总结(教你如何编程) 作者:July.编程艺术室. 出处:http://blog.csdn.net/v_JULY_v . 题记 好久没更新博客了,虽只有一个月,但对我 ...

最新文章

  1. 使用Qt编写模块化插件式应用程序
  2. 注册HttpSessionListener失效原因
  3. 【C++】源自指针的报错
  4. 米的建站日记(2014年12月18日)
  5. 中国功率半导体产业销售规模与投资策略研究报告2022版
  6. linux fedora35让GRUB 2记住上一次启动的操作系统
  7. linux测试游戏下载,一波超人内测版最新下载-一波超人内测版游戏下载v1.0.2-Linux公社...
  8. 一文学习python 所有基础知识_Python学习基础知识概要
  9. java贪吃蛇客户端服务器_java Socket套接字TCP编程开发服务端和客户端之间的通信 - 贪吃蛇学院-专业IT技术平台...
  10. django模板的使用方法
  11. 贝叶斯分类与贝叶斯网络
  12. 为什么电脑屏幕会横过来_笔记本电脑屏幕横过来了怎么办?笔记本电脑屏幕倒过来了恢复方法...
  13. 手摸手教你阅读和调试大型开源项目 ZooKeeper
  14. 数字图像处理 关于matlab的图像处理操作
  15. sklearn.metrics.confusion_matrix
  16. 「SQL面试题库」 No_55 销售分析 I
  17. CC-Proxy配置网络代理服务器
  18. 激发波长近红外二区发光量子点,近红外二区(NIR-II)发射波长(1000-1700 nm)
  19. windows上删除不了文件
  20. Java提取图片文字 tess4j

热门文章

  1. 与你的梦,种植于青山绿水间
  2. dblink导致存储过程报异常ORA-03113:通信通道文件尾 ORA-02063紧接着line(xxxdblink名称) ORA-06512在(xxxx)line 24
  3. 基于SSM实现医院预约挂号系统
  4. 已知华氏温度f c语言,编程题:已知两种温度的换算公式C=(5/9)(F-32),试编写一个程序输入华氏度F,输出摄氏度。...
  5. App中快速复用微信登录授权的一种方法
  6. 自己写一个strcmp函数(C++)
  7. 求三角形外接圆 hdu4720
  8. 洛谷B2006 地球人口承载力估计
  9. SAP 采购合同案例教程金额合同前台
  10. 有了这个抠图滤镜,设计师再也不怕扣头发婚纱了!