博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
查找树ADT——二叉搜索树
阅读量:5142 次
发布时间:2019-06-13

本文共 3480 字,大约阅读时间需要 11 分钟。

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

总概

  使二叉树成为二叉查找树的性质是,对于树中的每个节点X,它的左子树中所有关键字值小于X的关键字值,而它的右子树中所有的关键字值大于X的关键字值。注意,这意味着该树所有的元素可以用某种统一的方式排序。

操作

#ifndef __Tree_Hstruct 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);#endifstruct 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;}
 

  

 

转载于:https://www.cnblogs.com/ZhaoxiCheung/p/5832400.html

你可能感兴趣的文章
VS2010中编辑属性无法输入中文决绝
查看>>
Fat-tree 胖树交换网络
查看>>
结合foreman和upstart 管理unicorn进程
查看>>
潭州课堂25班:Ph201805201 django 项目 第三十一课 在线课堂视频点播的实现(课堂笔记)...
查看>>
Android题库
查看>>
1-5-06:奥运奖牌计数
查看>>
Python简介和入门
查看>>
Windows下Python连接sqlite3数据库
查看>>
Javascript 类与静态类的实现(续)
查看>>
notes: the architecture of GDB
查看>>
shim和polyfill有什么区别
查看>>
Failed to load the JNI shared library “E:/2000/Java/JDK6/bin/..jre/bin/client/jvm.dll
查看>>
GIMP模版的制作
查看>>
Zabbix3.4服务器的搭建--CentOS7
查看>>
〖Python〗-- IO多路复用
查看>>
栈(括号匹配)
查看>>
夜太美---酒不醉--人自醉
查看>>
Java学习 · 初识 面向对象深入一
查看>>
zabbix经常报警elasticsearch节点TCP连接数过高问题
查看>>
源代码如何管理
查看>>