二叉查找树

 

 

 

 

 来源:http://www.cnblogs.com/JCSU/articles/2026482.html

复制代码
/*******************************************************************************
/* <PRE>
/* 版权所有    : -
/* 模块名      : 查找
/* 文件名      : bitreeSearch.cpp
/* 功能描述    : 二叉排序树
/* 作者        : <xxx>
/* 版本        : 1.0
/* -----------------------------------------------------------------------------
/* 备注        : -
/* -----------------------------------------------------------------------------
/* 修改记录    :
/* 日 期        版本     修改人        修改内容
/* 2011/01/01   1.0      <xxx>         创建
/* </PRE>
******************************************************************************
*/
#include 
<stdio.h>
#include 
<stdlib.h>

/******************************************************************************
/* 数据类型和常量定义
/*****************************************************************************
*/
#define TRUE        1
#define FALSE       0
#define OK          1
#define ERROR       0
#define OVERFLOW   -2

typedef 
int   Status;  /* 函数结果状态码 */
typedef 
int   KeyType; /* 整型关键字 */

/* 数值型关键字的比较 */
#define EQ(a, b) ((a) == (b))
#define LT(a, b) ((a) < (b))


/******************************************************************************
/* 数据结构定义
/*****************************************************************************
*/
/* 数据元素类型定义 */
typedef 
struct {
    KeyType key;   
//关键字域
}ElemType;

/* 二叉树的链式存储结构 */
typedef 
struct BiTNode {
    ElemType data;
    
struct BiTNode *lchild, *rchild;
} BiTNode, 
*BiTree;


/******************************************************************************
/* 函数原型声明
/*****************************************************************************
*/
Status SearchBST(BiTree T, KeyType key, BiTree f, BiTree 
&p);
Status InsertBST(BiTree 
&T, ElemType e);
Status DeleteBST(BiTree 
&T, KeyType key);
Status Delete (BiTree 
&p);

Status Visit(ElemType e);
Status InOrderTraverse(BiTree 
&T, Status (*Visit)(ElemType));



/*******************************************************************************
/* <FUNC>
/* 函数名   : SearchBST
/* 功能     : 二叉排序树的查找方法
/* 参数     : -
/* 返回值   : -
/* 备注     : 在根指针T所指二叉排序树中递归地查找其关键字等于key的数据元素, 若查找
/*            成功, 则指针p指向该数据元素结点, 并返回TRUE, 否则指针p指向查找路径上
/*            访问的最后一个结点并返回FALSE, 指针f指向T的双亲, 其初始调用值为NULL
/* 作者     : <xxx>
/* </FUNC>
******************************************************************************
*/
Status SearchBST(BiTree T, KeyType key, BiTree f, BiTree 
&p)
{
    
if (!T) {p = f; return FALSE;}                                        //查找不成功
    else if EQ(key, T->data.key) {p = T; return TRUE;}                    //查找成功
    else if LT(key, T->data.key) return SearchBST(T->lchild, key, T, p);  //在左子树中查找
    else return SearchBST(T->rchild, key, T, p);                          //在右子树中查找
}

/*******************************************************************************
/* <FUNC>
/* 函数名   : InsertBST
/* 功能     : 插入元素到二叉排序树中
/* 参数     : -
/* 返回值   : -
/* 备注     : 当二叉排序树T中不存在关键字等于e.key的数据元素时, 插入e并返回TRUE,
/*            否则返回FALSE
/* 作者     : <xxx>
/* </FUNC>
******************************************************************************
*/
Status InsertBST(BiTree 
&T, ElemType e)
{
    BiTree s; BiTree p;
    
if (!SearchBST(T, e.key, NULL, p)) {                  //查找不成功
        s = (BiTree)malloc(sizeof(BiTNode));
        s
->data = e;  s->lchild = s->rchild = NULL;
        
if (!p) T = s;                     //被插结点*s为新的根结点
        else if LT(e.key, p->data.key) p->lchild = s;  //被插结点*s为左孩子
        else p->rchild = s;             //被插结点*s为右孩子
        return TRUE;
    }
    
else return FALSE;    //树中已有关键字相同的结点, 不再插入
}

/*******************************************************************************
/* <FUNC>
/* 函数名   : DeleteBST
/* 功能     : 从二叉排序树中删除一个结点
/* 参数     : -
/* 返回值   : -
/* 备注     : 若二叉排序树T中存在关键字等于key的数据元素时, 则删除该数据元素结点,
/*            并返回TRUE; 否则返回FALSE
/* 作者     : <xxx>
/* </FUNC>
******************************************************************************
*/
Status DeleteBST(BiTree 
&T, KeyType key)
{
    
if (!T) return FALSE;                         //不存在关键字等于key的数据元素
    else {
        
if (EQ(key, T->data.key)) {return Delete(T); } //找到关键字等于key的数据元素
        else if (LT(key, T->data.key)) return DeleteBST(T->lchild, key);
        
else return DeleteBST(T->rchild, key);
    }
}

/*******************************************************************************
/* <FUNC>
/* 函数名   : Delete
/* 功能     : 删除一个结点的过程
/* 参数     : -
/* 返回值   : -
/* 备注     : 从二叉排序树中删除结点p, 并重接它的左或右子树
/* 作者     : <xxx>
/* </FUNC>
******************************************************************************
*/
Status Delete (BiTree 
&p) {
    BiTree q;  BiTree s;
    
if (!p->rchild) {  //右子树空则只需重接它的左子树
        q = p; p = p->lchild; free(q);
    }
    
else if(!p->lchild) { //只需重接它的右子树
        q = p; p = p->rchild; free(q);
    }
    
else //左右子树均不空
    {
        q 
= p; s = p->lchild;
        
while (s->rchild) {q = s; s = s->rchild; }   //转左, 然后向右到尽头
        p->data = s->data;                           //s指向被删除结点的前驱
        if (q != p) q->rchild = s->lchild;           //重接*q的右子树
        else q->lchild = s->lchild;                  //重接*q的左子树
        delete s;
    }
    
return TRUE;
}


/*******************************************************************************
/* <FUNC>
/* 函数名   : Visit
/* 功能     : 打印节点数据
/* 参数     : -
/* 返回值   : -
/* 备注     : -
/* 作者     : <xxx>
/* </FUNC>
******************************************************************************
*/
Status Visit(ElemType e)
{
    printf(
"%d ", e.key);
    
return OK;
}

/*******************************************************************************
/* <FUNC>
/* 函数名   : InOrderTraverse
/* 功能     : 中序遍历二叉树
/* 参数     : -
/* 返回值   : -
/* 备注     : -
/* 作者     : <xxx>
/* </FUNC>
******************************************************************************
*/
Status InOrderTraverse(BiTree 
&T, Status (*Visit)(ElemType))
{
    
if(T){
        
if(InOrderTraverse(T->lchild, Visit))
            
if(Visit(T->data))
                
if(InOrderTraverse(T->rchild, Visit))
                    
return OK;
                
return ERROR;
    }
    
else
        
return OK;
}


/*******************************************************************************
/* <FUNC>
/* 函数名   : main
/* 功能     : 测试函数
/* 参数     : -
/* 返回值   : -
/* 备注     : -
/* 作者     : <xxx>
/* </FUNC>
******************************************************************************
*/
void main()
{
    BiTree T 
= NULL; ElemType e;

    
int i, j;
    
//插入元素
    for (i = 1; i <= 5; i++)
    {
        e.key 
= i;
        InsertBST(T, e);
    }
    
for (i = -5; i <= -3; i++)
    {
        e.key 
= i;
        InsertBST(T, e);
    }
    printf(
"elems inserted: ");
    InOrderTraverse(T, Visit);

    
//删除元素
    for (j = -5; j <= 4; j++)
    {
        DeleteBST(T, j);
    }
    printf(
"\nremaining after delete: ");
    InOrderTraverse(T, Visit);
}
复制代码
posted on 2013-08-30 20:26  猿人谷  阅读(384)  评论(0编辑  收藏  举报