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

转载于:https://www.cnblogs.com/JCSU/articles/2026482.html

《数据结构》二叉查找树相关推荐

  1. 数据结构--二叉查找树 Binary Search Tree

    文章目录 1.二叉查找树概念 2.二叉查找树操作 2.1 查找 2.2 插入 2.3 删除 2.4 其他 3. 支持重复数据的二叉查找树 4 有散列表了,还需要二叉查找树? 5 代码实现 1.二叉查找 ...

  2. c#数据结构———二叉查找树

    using System;<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" ...

  3. 学习数据结构 二叉查找树(binary search tree)

    2019独角兽企业重金招聘Python工程师标准>>> 为学习 LLVM 的 ImmutableSet,其底层的实现选择为 AVL 树(平衡二叉搜索树),我不很熟悉该树,虽然大致知道 ...

  4. Python数据结构————二叉查找树的实现

    对于二叉查找树的每个节点Node,它的左子树中所有的关键字都小于Node的关键字,而右子树中的所有关键字都大于Node的关键字. 二叉查找树的平均深度是O(log N). 1.初始化 class Bi ...

  5. 数据结构|-二叉查找树(二叉搜索树)的链式存储结构的实现

    二叉排序树,又称为二叉查找树. 它或者是一棵空树,或者是具有下列性质的二叉树. 若它的左子树不为空,则左子树上所有的结点的值均小于根结构的值: 若它的右子树不为空,则右字数上所有结点的值均大于它的根结 ...

  6. 数据结构——二叉查找树(BST)的删除

    数据结构--二叉树(BST)的删除 文章目录 数据结构--二叉树(BST)的删除 前言 一.BST删除的几种情况 二.节点删除方法 1.一般方法 2.对1方法的优化 3.懒汉删除(前继和后继) 前言 ...

  7. 数据库底层设计(MYSQL索引的数据结构)

    前言 说到数据库这个词,我只能用爱恨交加这个词来形容它.自己之前还单纯懵懂的时候进了数据库的课堂,听完数据库的课,觉得这是一门再简单不过的课程,任何一门编程语言都比SQL要晦涩难懂,任何一门理论课程都 ...

  8. MySQL底层为什么要选用B+树作为索引的数据结构呢?

    文章目录 MySQL底层为什么要选用B+树作为索引的数据结构呢? MySQL 索引底层数据结构选型 哈希表(Hash) 二叉查找树(BST) 平衡二叉树(AVL树) 红黑树 B-树 B+树 参考 My ...

  9. MySQL(三)MySQL索引原理

    数据库索引,是数据库管理系统(DBMS)中一个排序的数据结构,以协助快速查询.更新数据库表中数据.                                                    ...

  10. [转载] --- 数据库基本知识

    里面的很多点,我之前都总结过,但是感觉这篇把这些都连起来了,总结的挺好,转载保存一下 [从入门到入土]令人脱发的数据库底层设计 前言 说到数据库这个词,我只能用爱恨交加这个词来形容它.两年前在自己还单 ...

最新文章

  1. 爬虫之requests模块发送带参数的请求
  2. 华为某员工欲离职,看到年终奖后犹豫了:再干一年吧!
  3. 可穿戴的脑机接口设备将运动意念转化为行动
  4. python创造者_python 设计模式-建造者模式
  5. Indri和Terrier搜索引擎的使用
  6. windows下进程间通信的(13种方法)
  7. 转lua解释执行脚本流程
  8. 问题六十一:三次b样条(b-spline)曲线的控制点和曲线形状的对应——以回旋体的“基本曲线”为例(2)
  9. Centos之故障排除
  10. 廖雪峰Python学习
  11. 小米手表如何优雅听歌?
  12. 解锁图案-九宫格有多少种组合?安全吗?用程序来解答
  13. CS5213芯片|HDMI to VGA转换头芯片
  14. ORAN专题系列-28:5G基站如何升级到ORAN基站 - O-RU - 平台和传输层的改进(VLAN, PCP, DHCP, DNS)
  15. 赶紧更新!PC版微信被曝高危0day漏洞;特斯拉Autopilot源码窃取案尘埃落定
  16. QT实现加载百度离线地图
  17. 基于51单片机的故障灯检测
  18. 毕业设计-基于微信小程序与云开发的成绩查询系统
  19. 报错:java.lang.ClassNotFoundException: Cannot find implementation for解决方法
  20. MySQL查询这一篇就够了

热门文章

  1. 【论文】本周论文推荐(迁移学习、阅读理解、对话系统、图神经网络、对抗生成网络等)...
  2. 【10.9】每日NLP学术论文推荐
  3. 数据结构与算法python—11.查找及python实现与leetcode总结
  4. 《神经网络与深度学习》课程笔记(4)-- 浅层神经网络
  5. 机器学习11-不平衡数据之采样
  6. 智能问答系统方法综述
  7. Netty in action—Bootstraping
  8. 读书节第二日丨数据大咖来荐读,互动荐书赢好礼!
  9. Netty的并发编程实践1:正确使用锁
  10. 3.1 RNN 循环神经网络 概述(下篇)