一.二叉排序树定义

二叉排序树(Binary Sort Tree)或者是一棵空树;或者是具有下列性质的二叉树:

我们知道一颗基本的二叉树他们都需要满足一个基本性质--即树中的任何节点的值大于它的左子节点,且小于它的右子节点。所有结点只有左子树叫左斜树

左右子树也都是二叉排序树。

由图9.4 可以看出,对二叉排序树进行中序遍历,便可得到一个按关键码有序的序列,因此,一个无序序列,可通过构一棵二叉排序树而成为有序序列。

二.二叉排序树查找过程

从其定义可见,二叉排序树的查找过程为:

若查找树为空,查找失败。

查找树非空,将给定值kx 与查找树的根结点关键码比较。

若相等,查找成功,结束查找过程,否则,

a.当给kx 小于根结点关键码,查找将在以左子女为根的子树上继续进行,转①

b.当给kx 大于根结点关键码,查找将在以右子女为根的子树上继续进行,转①

以二叉链表作为二叉排序树的存储结构,则查找过程算法程序描述如下:

typedef struct NODE

{ ElemType elem; /*数据元素字段*/

struct NODE *lc,*rc; /*左、右指针字段*/

}NodeType; /*二叉树结点类型*/

【算法9.4】

int SearchElem(NodeType *t,NodeType **p,NodeType **q,KeyType kx)

{ /*在二叉排序树t 上查找关键码为kx 的元素,若找到,返回1,且q 指向该结点,p 指向其父结点;*/

/*否则,返回0,且p 指向查找失败的最后一个结点*/int flag=0; *q=t;while(*q) /*从根结点开始

查找*/{ if(kx>(*q)->elem.key) /*kx 大于当前结点*q 的元素关键码*/

{ *p=*q; *q=(*q)->rc; } /*将当前结点*q 的右子女置为新根*/

else

{ if(kxelem.key) /*kx 小于当前结点*q 的元素关键码*/

{ *p=*q; *q=(*q)->lc;} /*将当前结点*q 的左子女置为新根*/

else {flag=1;break;} /*查找成功,返回*/

}

}/*while*/

return flag;

}

三.二叉排序树插入操作和构造一棵二叉排序树

先讨论向二叉排序树中插入一个结点的过程:设待插入结点的关键码为kx,为将其插入,先要在二叉排序树中进行查找,若查找成功,按二叉排序树定义,待插入结点已存在,不用插入;查找不成功时,则插入之。因此,新插入结点一定是作为叶子结点添加上去的。

构造一棵二叉排序树则是逐个插入结点的过程。

【例9.3】记录的关键码序列为:63,90,70,55,67,42,98,83,10,45,58,则构造一棵二叉排序树的过程如下:

【算法9.5】

int InsertNode (NodeType **t,KeyType kx)

{ /*在二叉排序树*t 上插入关键码为kx 的结点*/

NodeType *p=*t,*q,*s; int flag=0;

if(!SearchElem(*t,&p,&q,kx)); /*在*t 为根的子树上查找*/

{ s=(NodeType *))malloc(sizeof(NodeType)); /*申请结点,并赋值*/

s->elem.key=kx;s->lc=NULL;s->rc=NULL;

flag=1; /*设置插入成功标志*/

if(!p) t=s; /*向空树中插入时*/

else

{ if(kx>p->elem.key) p->rc=s; /*插入结点为p 的右子女*/

else p->lc=s; /*插入结点为p 的左子女*/

}

}

return flag;

}

四.二叉排序树删除操作

1.在具有 n 个叶子结点的严格二叉树中,结点总数为( ) a.2n+1 b.2n c.2n-1 2.除根结点外,树上每个结点( ) a.可有任意多个孩子、任意多个双亲 b.可有任意多个孩子、一个双亲 c.可有一个孩子、任意多个双亲 d.只有一个孩子、一个双亲 3.具有 100 个结点的二叉树中,若用二叉链表存储,其指针域部分用来指向结点的左、右孩子,其余( )个指针域为空。合并思想是:程序需要3个指针:pa、pb、pc,其中pa,pb分别指向la表与lb表中当前待比较插入的结点,pc 指向lc表中当前最后一个结点。循环双链表的构造源自双链表,即将终端结点的nnext指针指向链表中第一个结点,将链表中第一个结点的prior指针指向终端结点。

*p 结点为叶结点,由于删去叶结点后不影响整棵树的特性,所以,只需将被删结点的双亲结点相应指针域改为空指针。如图9.6。

*p 结点只有右子树pr 或只有左子树pl,此时,只需将pr 或pl 替换*f 结点的*p 子树即可。如图9.7。

*p 结点既有左子树Pl 又有右子树Pr,可按中序遍历保持有序进行调整。

设删除*p 结点前,中序遍历序列为:

P 为F 的左子女时有:…,Pl 子树,P,Pj ,S 子树,Pk,Sk子树,…,P2,S2子树,P1,S1子树,F,…

P 为F 的右子女时有:…二叉排序树是,F,Pl 子树,P,Pj ,S 子树,Pk,Sk子树,…,P2,S2子树,P1,S1子树,…

则删除*p 结点后,中序遍历序列应为:

P 为F 的左子女时有:…,Pl 子树,Pj ,S 子树,Pk,Sk子树,…,P2,S2子树,P1,S1子树,F,…

P 为F 的右子女时有:…,F,Pl 子树,Pj ,S 子树,Pk,Sk子树,…,P2,S2子树,P1,S1子树,…

有两种调整方法:

直接令pl 为*f 相应的子树,以pr 为pl 中序遍历的最后一个结点pk 的右子树;

令*p 结点的直接前驱Pr 或直接后继(对Pl子树中序遍历的最后一个结点Pk)替换*p 结点,再按⒉的方法删去Pr 或Pk。图9.8 所示的就是以*p 结点的直接前驱Pr 替换*p。

【算法9.6】

int DeleteNode(NodeType **t,KeyType kx)

{ NodeType *p=*t,*q,*s,**f;

int flag=0;

if(SearchElem(*t,&p,&q,kx));

{ flag=1; /*查找成功,置删除成功标志*/

if(p= =q) f=&(*t); /*待删结点为根结点时*/

else /*待删结点非根结点时*/

{ f=&(p->lc); if(kx>p->elem.key) f=&(p->rc);

} /*f 指向待删结点的父结点的相应指针域*/

供选择的答案: a:①是特殊的树②不是树的特殊形式③是两棵树的总称④是只有二个根结点的树形结构 b:①左子结点②右子结点③左子结点或者没有右子结点 ④兄弟 c~d: ①最左子结点②最右子结点③最邻近的右兄弟④最邻近的左兄弟⑤最左的兄弟⑥最右的兄弟e:①o(n)②o(n)③o(log2n)④o(log2n) 15、每一棵树都能唯一地转换为它所对应的二叉树,树的这种二叉树表示对树的运算带来很大的好处。用链式存储结构来表示二叉树,一个结点至少由3个域组成,即数据域、左子结点域和右子结点域(如图1所示)。树和森林都可以转换为二叉树,二者的不同是:树转换成的二叉树,其根结点必然无右孩子,而森林转换后的二叉树,其根结点有右孩子。

else

供选择的答案: a:①是特殊的树②不是树的特殊形式③是两棵树的总称④是只有二个根结点的树形结构 b:①左子结点②右子结点③左子结点或者没有右子结点 ④兄弟 c~d: ①最左子结点②最右子结点③最邻近的右兄弟④最邻近的左兄弟⑤最左的兄弟⑥最右的兄弟e:①o(n)②o(n)③o(log2n)④o(log2n) 15、每一棵树都能唯一地转换为它所对应的二叉树,树的这种二叉树表示对树的运算带来很大的好处。用链式存储结构来表示二叉树,一个结点至少由3个域组成,即数据域、左子结点域和右子结点域(如图1所示)。树和森林都可以转换为二叉树,二者的不同是:树转换成的二叉树,其根结点必然无右孩子,而森林转换后的二叉树,其根结点有右孩子。

else /*既有左子树又有右子树*/

{ p=q->rc;s=p;

while(p->lc) {s=p;p=p->lc;}/*在右子树上搜索待删结点的前驱p*/

*f=p;p->lc=q->lc; /*替换待删结点q,重接左子树*/

if(s!=p)

{ s->lc=p->rc; /*待删结点的右子女有左子树时,还要重接右子树*/

p->rc=q->rc;

}

}

}

free(q);

}

return flag;

}

在数据结构中,已知一棵二叉树的先序序列和中序序列,可唯一确定此二叉树。已知一棵二叉树的前序序列和中序序列,构造该二叉树的过程如下:。若已知一棵二叉树的前序序列是befcgdh,中序序列是febgchd,则它的后序序列必是___d___,而且可得该二叉树所表示的树的先根次序序列是___b___。

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-105358-1.html

java二叉排序树动态查找表_9.3.1动态查找表—二叉排序树相关推荐

  1. Java有序表查找:折半查找、二分查找、差值查找和斐波那契查找

    Java有序表查找:折半查找.二分查找.差值查找和斐波那契查找     [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/51 ...

  2. 动态顺序表的创建,增加,删除,查找

    先上代码,先上代码 #include<stdio.h> #include<stdlib.h> #define initsize 10 typedef struct {int* ...

  3. java实现线性表的案例_数据结构—线性表(LinearList)的原理以及Java实现案例

    线性表:零个或多个数据元素的有限序列.包括数组.链表.栈空间.队列等结构都属于线性表. 本文将介绍Java线性表中的数组.链表的实现逻辑,并附有数组线性表.单链表.静态链表的Java实现源码. 数据结 ...

  4. 用了十年竟然都不对,Java、Rust、Go主流编程语言的哈希表比较

    哈希表(HashMap.字典)是日常编程当中所经常用到的一种数据结构,程序员经常接解到的大数据Hadoop技术栈.Redis缓存数据库等等最近热度很高的技术,其实都是对键值(key-value)数据的 ...

  5. java毕业设计——基于java+MMAS的蚁群算法路由选择可视化动态模拟设计与实现(毕业论文+程序源码)——蚁群算法路由选择可视化动态模拟

    基于java+MMAS的蚁群算法路由选择可视化动态模拟设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+MMAS的蚁群算法路由选择可视化动态模拟设计与实现,文章末尾附有本毕业设计的 ...

  6. java linkedlist 查找_Java中LinkedList真的是查找慢增删快

    测试结果 废话不多说,先上测试结果.作者分别在ArrayList和LinkedList的头部.尾部和中间三个位置插入与查找100000个元素所消耗的时间来进行对比测试,下面是测试结果 (感谢@Hosa ...

  7. 【转】如何设计动态(不定)字段的产品数据库表?

    因为最近要用到设计动态量表的功能,找了一篇技术上实现动态设计表字段的文章,借来用用. 原文地址:http://blog.sina.com.cn/s/blog_85295a390101dou0.html ...

  8. HIVE的安装配置、mysql的安装、hive创建表、创建分区、修改表等内容、hive beeline使用、HIVE的四种数据导入方式、使用Java代码执行hive的sql命令

    1.上传tar包 这里我上传的是apache-hive-1.2.1-bin.tar.gz 2.解压 mkdir -p /home/tuzq/software/hive/ tar -zxvf apach ...

  9. 【Java数据结构与算法】第九章 顺序查找、二分查找、插值查找和斐波那契查找

    第九章 顺序查找.二分查找.插值查找和斐波那契查找 文章目录 第九章 顺序查找.二分查找.插值查找和斐波那契查找 一.顺序查找 1.基本介绍 2.代码实现 二.二分查找 1.基本介绍 2.代码实现 三 ...

最新文章

  1. win10系统优化计算机,全面优化win10电脑系统详细教程 | 专业网吧维护
  2. 再谈Spring Boot中的乱码和编码问题
  3. javaweb分页的后端实现
  4. react 设计模式与最佳实践
  5. CTF常用python库PwnTools的使用学习
  6. WPF 蒙罩层 LoadingPage
  7. nginx 一个请求发给多台机器_一个机器人可以同时为多台数控机床上下料吗?东智力衡...
  8. php mysql增修删_PHP mysql PDO增、删、查、改
  9. Python基础(三)文件操作和处理json
  10. 人才认证+奖金,智能分拣挑战赛baseline助力最后冲刺
  11. diskData磁盘数据分析
  12. php mysql时间倒序,php mysql时间已过去计算
  13. 在控制台中操作MYSQL数据库步骤以及一些小问题
  14. Visio2007产品密钥
  15. 【接口测试】接口测试用例设计
  16. Excel数据导出到txt文档
  17. 手把带你学会红外避障循迹模块
  18. 设置HTML为桌面壁纸
  19. 这七种职业男人让多少日本女性着迷
  20. CADD课程学习(10)-- 模拟不同体系与蛋白-蛋白相互作用(ZDOCK)

热门文章

  1. 我的世界javaui材质包怎么下载_【我的世界指南】七、使用皮肤
  2. PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to fi
  3. chrome 适配调试_移动端适配
  4. 增强使用功能的Steam开源工具箱一枚
  5. 腾讯公布 23 年前第一间办公室照片
  6. 每日一皮:爸爸你听我解释...
  7. 线上慢查询?试试这几个优化思路!
  8. PolarDB数据库性能大赛:95后徐妈的经验分享
  9. android6.0升级名单,三星Android 6.0升级详细名单[多图]
  10. java grizzly_java grizzly实现http服务器