zoukankan      html  css  js  c++  java
  • 二叉查找树

     来源: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(
    " remaining after delete: ");
        InOrderTraverse(T, Visit);
    }
    复制代码
  • 相关阅读:
    session、cookie、token
    跨域问题-nginx代理
    跨域问题-jsonp
    fat32转ntfs
    nginx日志输出,https,ssl
    nginx安装
    MySql(一)表类型(存储引擎)
    ShowDoc,APIDoc,可道云API,语雀-适合IT企业的文档工具
    Docker Compose搭建Redis一主二从三哨兵高可用集群
    Docker容器启动Mysql,Docker实现Mysql主从,读写分离
  • 原文地址:https://www.cnblogs.com/heyonggang/p/3292443.html
Copyright © 2011-2022 走看看