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

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

 

 

 

 

 来源:

/*
******************************************************************************
/* <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);
}

转载地址:http://vzwuo.baihongyu.com/

你可能感兴趣的文章
python的单例模式
查看>>
13~1003的和
查看>>
myeclipse启动jboss报ERROR [MainDeployer] Could not create deployment
查看>>
pycharm如何新项目如何不默认创建虚拟环境(吐槽)
查看>>
Loadrunner检查点小结(很经典)
查看>>
MySQL字段类型详解
查看>>
ORACLE 的游标
查看>>
虚拟机安装的UBUNTU全屏的方法:
查看>>
java虚拟机类加载器
查看>>
ASP.NET状态管理之八(会话Session)
查看>>
I.MX6 Android 5.1.1 下载、编译
查看>>
background
查看>>
转载:大型网站架构演变和知识体系
查看>>
testNG 学习笔记 Day 1 使用功能详解
查看>>
JAVA 将图片转换为Base64编码
查看>>
ubantu 编译mysql++
查看>>
团队-象棋游戏-开发文档
查看>>
各项目意见(第一阶段)
查看>>
阿里默认不开25端口
查看>>
js的相关函数封装(正则表达式,获取url参数,时间格式化)
查看>>