查找树ADT——二叉搜索树
在以下讨论中,虽然任意复杂的关键字都是允许的,但为了简单起见,假设它们都是整数,并且所有的关键字是互异的。
总概
使二叉树成为二叉查找树的性质是,对于树中的每个节点X,它的左子树中所有关键字值小于X的关键字值,而它的右子树中所有的关键字值大于X的关键字值。注意,这意味着该树所有的元素可以用某种统一的方式排序。
操作
#ifndef __Tree_H
struct TreeNode *Position;
typedef struct TreeNode *SearchTree;
SearchTree MakeEmpty (SearchTree T);
Position Find (ElementType X,SearchTree T);
Position FindMin (SearchTree T);
Position FindMax (SearchTree T);
SearchTree Insert (ElementType X,SearchTree T);
SearchTree Delete (ElementType X,SearchTree T);
ElementType Retrieve(Position P);
#endif
struct TreeNode
{
ElementType Element;
SearchTree Left;
SearchTree Right;
};
1、MakeEmpty
这个操作主要用于初始化。
SearchTree MakeEmpty (SearchTree T)
{
if (T != NULL)
{
MakeEmpty(T->Left);
MakeEmpty(T->Right);
free(T);
}
return NULL;
}
2、Find
这个操作一般需要返回指向树T中具有关键字X的节点的指针,如果这样的节点不存在则返回NULL。注意测试的顺序。关键的问题是首先要对是否为空树进行测试,否则就可能在NULL指针上兜圈子。其余的测试应该使得最不可能的情况安排的最后进行。
Position Find (ElementType X,SearchTree T)
{
if (T == NULL)
return NULL;
if (X < T->Element)
return Find(X,T->Left);
else if (X > T->Element)
return Find(X,T->Right);
else
return T;
}
3、FindMin和FindMax
为执行FindMin,从根开始并且只要有左儿子就向左进行。FindMax例程除分支朝向右儿子外,其余的过程相同。
Position FindMin(SearchTree T) //递归
{
if (T == NULL)
return NULL;
else if (T->Left == NULL)
return T;
else
return FindMin(T->Left);
}
Position FindMax(SearchTree T) //非递归
{
if (T != NULL)
while (T->Right != NULL)
T = T->Right;
return T;
}
4、Insert
进行插入操作的例程在概念上是简单的。为了将X插入到树T中,我们可以像用Find那样沿着树查找。如果找到X,则什么都不用做(或是做一些更新),否则,将X插入到遍历的路径的最后一点上。重复元的插入可以通过在节点记录中保留一个附加域以指示发生的频率来处理。这使得整个的树增加了某些附加空间,但是,却比将重复信息放到树中要好(它将使得树的深度变得很大)。当然,如果关键字只是一个更大结构的一部分,那么这种方法行不通,此时我们可以把具有相同关键字的所有结构保留在一个辅助数据结构中,如表或是另一棵查找树中。
SearchTree Insert(ElementType X,SearchTree T)
{
if (T == NULL)
{
/*Create and return a one-node tree*/
T = malloc(sizeof(struct TreeNode));
if (T == NULL)
{
FatalError("Out of Space!!!");
}
else
{
T->Element = X;
T->Left = T->Right = NULL;
}
}
else if (X < T->Element)
T->Left = Insert(X,T->Left);
else if (X > T->Element)
T->Right = Insert(X,T->Right);
/*Else X is in the tree already;we'll do nothin*/
return T; /*Do not forget this line!*/
}
5、Delete 如果节点是一片树叶,那么它可以立即被删除,如果节点有一个儿子,则该节点可以在其父节点调整指针绕过该节点后被删除。注意,所删除的节点现在已不再引用,而该节点只有在指向它的指针已被省去的情况下才能够被去掉。
复杂情况之处理具有两个儿子的系欸但那。一般的删除策略是用其右子树的最小的数据(很容易找到)代替该节点的数据病递归删除那个节点(现在它是空的)。因为右子树中的最小的节点不可能有左儿子,所以第二次Delete要容易。
SearchTree Delete( ElementType X, SearchTree T )
{
Position TmpCell;
if( T == NULL )
Error( "Element not found" );
else if( X < T->Element ) /* Go left */
T->Left = Delete( X, T->Left );
else if( X > T->Element ) /* Go right */
T->Right = Delete( X, T->Right );
else /* Found element to be deleted */
if( T->Left && T->Right ) /* Two children */
{
/* Replace with smallest in right subtree */
TmpCell = FindMin( T->Right );
T->Element = TmpCell->Element;
T->Right = Delete( T->Element, T->Right );
}
else /* One or zero children */
{
TmpCell = T;
if( T->Left == NULL ) /* Also handles 0 children */
T = T->Right;
else if( T->Right == NULL )
T = T->Left;
free( TmpCell );
}
return T;
}
查找树ADT——二叉搜索树的更多相关文章
- 【数据结构与算法Python版学习笔记】树——平衡二叉搜索树(AVL树)
定义 能够在key插入时一直保持平衡的二叉查找树: AVL树 利用AVL树实现ADT Map, 基本上与BST的实现相同,不同之处仅在于二叉树的生成与维护过程 平衡因子 AVL树的实现中, 需要对每个 ...
- 树&二叉树&二叉搜索树
树&二叉树 树是由节点和边构成,储存元素的集合.节点分根节点.父节点和子节点的概念. 二叉树binary tree,则加了"二叉"(binary),意思是在树中作区分.每个 ...
- AOJ/树与二叉搜索树习题集
ALDS1_7_A-RootedTree. Description: A graph G = (V, E) is a data structure where V is a finite set of ...
- 数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)
树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: BST树 ...
- 二叉搜索树-php实现 插入删除查找等操作
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的 ...
- Java创建二叉搜索树,实现搜索,插入,删除操作
Java实现的二叉搜索树,并实现对该树的搜索,插入,删除操作(合并删除,复制删除) 首先我们要有一个编码的思路,大致如下: 1.查找:根据二叉搜索树的数据特点,我们可以根据节点的值得比较来实现查找,查 ...
- 二叉搜索树(BST)学习笔记
BST调了一天,最后遍历参数错了,没药救了-- 本文所有代码均使用数组+结构体,不使用指针! 前言--BFS是啥 BST 二叉搜索树是基于二叉树的一种树,一种特殊的二叉树. 二叉搜索树要么是一颗空树, ...
- hdu 3791:二叉搜索树(数据结构,二叉搜索树 BST)
二叉搜索树 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submiss ...
- PAT 天梯赛 L2-004 这是二叉搜索树吗?
递归判断+建树 题目链接:https://www.patest.cn/contests/gplt/L2-004 题解 二叉搜索树的特点就是其根节点的值是位于左右子树之间的,即大于左子树的所有值,但是小 ...
随机推荐
- ORA-00824: cannot set sga_target due to existing internal settings, see alert log for more information
这篇文章是上篇文章”Expdp 导数错误 ORA-00832”的延续,前几天工作比较忙.累,直到今天才整理发出来.这个数据库实例的参数设置比较诡异其实是有原因的,由于这台数据库服务器系统是32位,数据 ...
- django ORM
http://www.cnblogs.com/alex3714/articles/5512568.html 常用ORM操作 一.示例Models from django.db import model ...
- 原生 CSS 网格布局学习笔记
下是来自Oliver Williams的帖子. Oliver已经学习了相当长时间的原生CSS网格,可以说是在CSS网格方面有一定的发言权.在这篇文章中,他将以非同寻常的思路分析自己的CSS网格布局学习 ...
- MongoDB学习笔记~数据结构与实体对象不一致时,它会怎么样?
回到目录
- 内存管理内幕mallco及free函数实现
原文:https://www.ibm.com/developerworks/cn/linux/l-memory/ 为什么必须管理内存 内存管理是计算机编程最为基本的领域之一.在很多脚本语言中,您不必担 ...
- Elasticsearch配置文件说明
一.Cluster setting Cluster indices.ttl.interval 允许设置多久过期的文件会被自动删除.默认值是60秒. indices.cache.filter.siz ...
- Mysql主从复制,读写分离(mysql-proxy),双主结构完整构建过程
下面介绍MySQL主从复制,读写分离,双主结构完整构建过程,不涉及过多理论,只有实验和配置的过程. Mysql主从复制(转载请注明出处,博文地址:) 原理是master将改变记录到二进制日志(bina ...
- Redis学习笔记4-Redis配置详解
在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redi ...
- 使用Struts框架,实现用户登陆功能
前言:本篇文章是本人这周学习的一个小结,在自我总结的同时,希望也能够给其他同学带来一点帮助.本文主要知识是参照书本上的知识点以及网上其他博客文章,在上机操练后的所得,具体源码主要来自http://bl ...
- On having layout
英文原文在此:http://www.satzansatz.de/cssd/onhavinglayout.htm 介绍 Internet Explorer 中有很多奇怪的渲染问题可以通过赋予其“layo ...
