二叉查找树

 

 

 

 

 来源: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);
}
复制代码
复制代码



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值