首页 > 其他 > 详细

查找树ADT——二叉查找树

时间:2014-03-24 06:38:43      阅读:494      评论:0      收藏:0      [点我收藏+]

二叉查找树:对于树中的每个节点X,它的左子数种所有关键字值小于X的关键字,而它的右子树种所有关键字值大于X的关键字值。

bubuko.com,布布扣
/* 二叉查找树声明 */

#ifndef _TREE_H

struct TreeNode;
typedef 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);
ElementType Retrieve(Position P);

#endif    /* _TREE_H */
bubuko.com,布布扣
bubuko.com,布布扣
/* 建立一棵空树 */

SearchTree
MakeEmpty(SearchTree T)
{
    if(T != NULL)
    {
        MakeEmpty(T->Left);
        MakeEmpty(T->Right);
        free(T);
    }
    return NULL;
}
bubuko.com,布布扣
bubuko.com,布布扣
/* 二叉查找树的Find操作 */

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;
}
bubuko.com,布布扣
bubuko.com,布布扣
/* 对二叉查找树的FindMin的递归实现 */

Position
FindMin(SearchTree T)
{
    if(T == NULL)
        return NULL;
    else if(T->Left == NULL)
        return T;
    else
        return FindMin(T->Left);
}
bubuko.com,布布扣
bubuko.com,布布扣
/* 对二叉查找树的FindMax的非递归实现 */

Position
FindMax(SearchTree T)
{
    if(T != NULL)
        while(T->Right != NULL)
            T = T->Right;

    return T;
}
bubuko.com,布布扣
bubuko.com,布布扣
/* 插入元素到二叉树 */

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!\n");
        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 nothing */

    return T;    /* Do not forget this line!!! */
}
bubuko.com,布布扣
bubuko.com,布布扣
/* 二叉查找树的删除 */

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)
        T->Right = Delete(X, T->Right);
    else 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;
}
bubuko.com,布布扣

查找树ADT——二叉查找树,布布扣,bubuko.com

查找树ADT——二叉查找树

原文:http://www.cnblogs.com/nufangrensheng/p/3619797.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!