在以下讨论中,虽然任意复杂的关键字都是允许的,但为了简单起见,假设它们都是整数,并且所有的关键字是互异的。

总概

  使二叉树成为二叉查找树的性质是,对于树中的每个节点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——二叉搜索树的更多相关文章

  1. 【数据结构与算法Python版学习笔记】树——平衡二叉搜索树(AVL树)

    定义 能够在key插入时一直保持平衡的二叉查找树: AVL树 利用AVL树实现ADT Map, 基本上与BST的实现相同,不同之处仅在于二叉树的生成与维护过程 平衡因子 AVL树的实现中, 需要对每个 ...

  2. 树&二叉树&二叉搜索树

    树&二叉树 树是由节点和边构成,储存元素的集合.节点分根节点.父节点和子节点的概念. 二叉树binary tree,则加了"二叉"(binary),意思是在树中作区分.每个 ...

  3. AOJ/树与二叉搜索树习题集

    ALDS1_7_A-RootedTree. Description: A graph G = (V, E) is a data structure where V is a finite set of ...

  4. 数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)

    树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: BST树 ...

  5. 二叉搜索树-php实现 插入删除查找等操作

    二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的 ...

  6. Java创建二叉搜索树,实现搜索,插入,删除操作

    Java实现的二叉搜索树,并实现对该树的搜索,插入,删除操作(合并删除,复制删除) 首先我们要有一个编码的思路,大致如下: 1.查找:根据二叉搜索树的数据特点,我们可以根据节点的值得比较来实现查找,查 ...

  7. 二叉搜索树(BST)学习笔记

    BST调了一天,最后遍历参数错了,没药救了-- 本文所有代码均使用数组+结构体,不使用指针! 前言--BFS是啥 BST 二叉搜索树是基于二叉树的一种树,一种特殊的二叉树. 二叉搜索树要么是一颗空树, ...

  8. hdu 3791:二叉搜索树(数据结构,二叉搜索树 BST)

    二叉搜索树 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submiss ...

  9. PAT 天梯赛 L2-004 这是二叉搜索树吗?

    递归判断+建树 题目链接:https://www.patest.cn/contests/gplt/L2-004 题解 二叉搜索树的特点就是其根节点的值是位于左右子树之间的,即大于左子树的所有值,但是小 ...

随机推荐

  1. ORACLE编译失效对象小结

    在日常数据库维护过程中,我们会发现数据库中一些对象(包Package.存储过程Procedure.函数Function.视图View.同义词.....)会失效,呈现无效状态(INVALID).有时候需 ...

  2. hive 内部表和外部表的区别和理解

    1. 内部表 create table test (name string , age string) location '/input/table_data'; 注:hive默认创建的是内部表 此时 ...

  3. 如何查看MapReduce执行的程序中的输出日志

    我们开发程序的时候,好多人都喜欢用sysout输出内容来查看运行情况.但是在MR程序里写了之后,却不知道去哪里查找,可以参考这篇文章. 第一种方法,我们可以在MapReduce任务查看页面找到这些日志 ...

  4. XmlSerializer的使用

    关键词: XmlSerializer StreamWriter T instance 保存xml文件 代码: public static void SaveXML<T>(string xm ...

  5. UEFI+GPT模式下的Windows系统中分区结构和默认分区大小及硬盘整数分区研究

    内容摘要:本文主要讨论和分析在UEFI+GPT模式下的Windows系统(主要是最新的Win10X64)中默认的分区结构和默认的分区大小,硬盘整数分区.4K对齐.起始扇区.恢复分区.ESP分区.MSR ...

  6. java HashMap

    HashMap 的性能因子 1. 容量:表示桶位的数量. 2. 初始容量: 表在创建是所拥有的桶位数.   如果你知道将要在HashMap存储多少项,创建一个初始容量合适的HashMap将可以避免自动 ...

  7. 利用oneproxy部署mysql数据库的读写分离

    实验系统:CentOS 6.6_x86_64 实验前提:防火墙和selinux都关闭 实验说明:本实验共有4台主机,IP分配如拓扑 实验软件:mariadb-10.0.20 oneproxy-rhel ...

  8. SDN:motivation

    今天公交车上看了会SDN一本介绍性的书籍,具体名字不记得了.我想,我已经在实验室呆了很久的时间的,接触SDN也有一段时间了.对SDN的一些基本的知识还是需要好好整理一番.当然,这里只是一个随笔,想到什 ...

  9. 洛谷10月月赛Round.1| P3398 仓鼠找sugar[LCA]

    题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c) ...

  10. 发布和运行HOLOLENS程序注意这里要勾上,不然就成普通的UWP程序了!