查找基本概念

查找表:由同一类型的数据元素构成的集合。对查找表的常用操作:查询元素是否存在、查询元素属性、插入一个数据元素、删除一个数据元素。

查找:也叫检索,是根据给定的某个值,在表中确定一个关键字等于给定值的数据元素。

关键字:可以标识一个数据元素的某个数据项。

主关键字:可以唯一地识别一个数据元素的关键字。

静态查找表:只进行查询某元素在表中与否或检索某元素的各种属性操作的表。

动态查找表:查找时同时进行插入表中无的元素或删除表中有的某元素的表。

二叉排序树

定义:二叉排序树(Binary Sort Tree)或者是一棵空树;或者是具有下列性质的二叉树:

1)若左子树不空,则左子树上所有结点的值均小于根结点的值;若右子树不空,则右子树上所有结点的值均大于等于根结点的值。2)左右子树也都是二叉排序树。

二叉排序树查找过程:若二叉排树为空,则查找失败,否则,先拿根结点值与待查值进行比较,若相等,则查找成功,若根结点值大于待查值,则进入左子树重复此步骤,否则,进入右子树重复此步骤,若在查找过程中遇到二叉排序树的叶子结点时,还没有找到待找结点,则查找不成功。

二叉树的二叉链表结点结构定义

typedef  struct BiTNode  /* 结点结构 */
{int data;  /* 结点数据 */struct BiTNode *lchild, *rchild;  /* 左右孩子指针 */
} BiTNode, *BiTree;
二叉排序树的查找操作
/*递归查找二叉排序树T中是否存在key, 指针f指向T的双亲,其初始调用值为NULL,
若查找成功,则指针p指向该数据元素结点,并返回true,否则指针p指向查找路径上
访问的最后一个结点并返回false */
bool SearchBST(BiTree T, int key, BiTree f, BiTree *p)
{if (!T)/*查找不成功*/{*p=f;return false;}else if (T->data==key)/*查找成功*/{*p=T;return true;}else if (T->data>key){return SearchBST(T->lchild,key,T,p);/*在左子树中继续查找*/}elsereturn SearchBST(T->rchild,key,T,p);/*在右子树中继续查找*/
}
二叉排序树插入操作
/*  当二叉排序树T中不存在关键字等于key的数据元素时, 插入key并返回true,否则返回false */
bool InsertBST(BiTree *T, int key)
{BiTree p,s;//中间变量if (!SearchBST(*T,key,NULL,&p))//查找不成功{s=(BiTree)malloc(sizeof(BiTNode));s->data=key;s->lchild=s->rchild=NULL;if (!p)//树为空,插入新的根结点{*T=s;}else if (key<p->data){p->lchild=s;//插入左孩子}elsep->rchild=s;//插入右孩子return true;}return false;
}
二叉排序树删除操作
bool DeleteBST(BiTree *T, int key)
{if (!*T)//不存在关键字等于key的数据元素return false;else if (key==(*T)->data){return delete(T);}else if (key<(*T)->data){return DeleteBST(&(*T)->lchild,key);}elsereturn DeleteBST(&(*T)->rchild,key);}
/* 从二叉排序树中删除结点p,并重接它的左或右子树*/
bool delete(BiTree *p)
{BiTree q,s;//中间变量if ((*p)->rchild==NULL){//右子树为空,重接左子树q=*p;*p=(*p)->lchild;free(q);}else if ((*p)->lchild==NULL){//左子树为空,重接右子树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;//被删结点前驱的值取代被删结点的值if (q!=*p){//重建q的右子树q->rchild=s->lchild;}else{//重建q的左子树q->lchild=s->lchild;}free(s);}return true;
}

转载请注明出处: http://blog.csdn.net/lsh_2013/article/details/45601089

二叉排序树(概念,查找,插入,删除)相关推荐

  1. 重温数据结构:二叉排序树的查找、插入、删除

    读完本文你将了解到: 什么是二叉排序树 Binary Sort Tree, BST 二叉排序树的关键操作 1.查找 2.插入 3.删除 * 运行代码测试 一道面试题 总结 Thanks 我们知道,二分 ...

  2. 数据结构(8-3)二叉排序树(查找、插入删除)

    目录 一.基础理论 1.特点: 2.结构: 二.查找 三.插入 四.删除 1.被删除的结点D是叶子结点 2.被删除的结点D仅有一个孩子 2-1.删除结点14(有左无右) 2-2.删除结点 10 (有右 ...

  3. 【大话数据结构C语言】56 二叉排序树的查找、插入和删除

    欢迎关注我的公众号是[CodeAllen],关注回复[1024]获取精品学习资源 程序员技术交流①群:736386324 ,程序员技术交流②群:371394777 目录 二叉排序树查找关键字 二叉排序 ...

  4. 二叉排序树的查找、插入、创建和删除

    二叉排序树的特性: 1.若左子树非空,则左子树上所有结点的值均小于根节点的值: 2.若右子树非空,则右子树上所有结点的值均大于根节点的值: 3.左右子树又分别是一颗二叉排序树: 综上,左子树结点的值& ...

  5. 一种基于平衡二叉树(AVL树)插入、查找和删除的简易图书管理系统

    目录 1. 需求分析 2. 项目核心设计 2.1 结点插入 2.2 结点删除 3 测试结果 4 总结分析 4.1 调试过程中的问题是如何解决的,以及对设计与实现的回顾讨论和分析 4.2 算法的时间和空 ...

  6. 用c语言实现单链表的初始化,建表,查找,求长度,插入,删除等操作,【YTU+2430+C语言习题+链表建立+插入+删除+输(5)...

    的打印.判断链表是否为空.计算链表长度.插入节点.删除节点.删除整个链表.(2) 线性表adt顺序存储实现中的创建.查找.插入和删除等基本操作及相关算法,线性表adt链式存储实现中单链表.循环链表和双 ...

  7. 顺序表的插入删除查找遍历

    顺序表的插入删除查找遍历 文章目录 顺序表的插入删除查找遍历 代码 运行结果截图 代码 #define Maxsize 100typedef int ElemType; typedef struct{ ...

  8. Java编号姓名元宝数密码,通过my Eclipse控制台向数据库(SQL2008)中查找、删除、插入信息...

    通过my Eclipse控制台向数据库(SQL2008)中查找.删除.插入信息如果编译程序有什么错误还望大家多多指正代码执行所需数据库.架包及java源文件已上传至文件 文件名 SQl_JDBC.zi ...

  9. 带头结点的单链表的初始化,建立,插入,查找,删除

    //带头结点的单链表的初始化,建立,插入,查找,删除     #include <stdio.h>     #include <stdlib.h> typedef int El ...

  10. STL string容器 构造,查找,替换,拼接,比较,截取,插入删除

    目录 构造函数 赋值操作​ 字符串拼接 查找替换 字符串比较 字符串存取 插入删除 字符串截取 构造函数 #include<iostream> using namespace std; # ...

最新文章

  1. 互联网惨遭Struts高危漏洞摧残
  2. 【ES6】正则表达式的拓展
  3. C#笔记24:善用Visual Studio
  4. 值得推荐的C/C++框架和库 【强烈推荐】
  5. Prism区域异常问题分析(导航失效?)
  6. 在Spring Boot应用程序中测试邮件代码
  7. 使用Python创建一个系统监控程序
  8. DB2造数据存储过程
  9. fv-15php1c 安装图,SQLite - C/C++接口 API(一)
  10. label之间展示间距_工法样板如何做?碧桂园质量工法样板展示区做法标准
  11. android常用代码合集,Android开发常用经典代码段集锦
  12. 在C语言中的实型变量分为两种类型6,在C语言中的实型变量分为两种类型.doc
  13. Kotlin中使用BottomNavigationView实现底部导航
  14. [LintCode]144. 交错正负数(献给卡在65%的你)
  15. win7计算机u盘不显示盘符,U盘不显示磁盘盘符的解决方法
  16. 电脑系统下载,安全,纯净,原版,iso系统
  17. 涉密计算机用户登录密码多久换一次,涉密计算机口令应根据其密级进行设置并定期更换,秘密级计算机口令更换周期不得超过30天,机密级计算机口令更换周期不得超过10天 - 作业在线问答...
  18. springboot 使用Druid数据库连接池
  19. 【中创AI】斯坦福人工智能年度报告:AI论文发表量中国世界第一!
  20. 链脉AI智能电子名片,让交际更有效

热门文章

  1. bzoj 1669: [Usaco2006 Oct]Hungry Cows饥饿的奶牛
  2. bzoj 4033: [HAOI2015]树上染色(树形DP)
  3. [PyTorch] 基于Python和PyTorch的cifar-10分类
  4. kubectl命令大全
  5. [理解] Linux 作为一个服务器是怎样的存在 (一)
  6. date-打印或者设置系统日期和时间
  7. 新手学习算法----二叉树(将一个二叉查找树按照中序遍历转换成双向链表)
  8. java事务的类型——面试被问到
  9. Exchange2003/2010共存模式环境迁移
  10. 深入理解Javascript之this关键字