BST的概念

BST,又叫平衡二叉树,是一种循关键码访问的二叉树,并且要求保持顺序性,即任一节点不小于其左后代,不大于其右后代(注意是后代,不是孩子)。BST的顺序性使得其中序遍历序列一定是单调非降的。

BST的查找算法

BinNodePos(T) BST_Search1(BinNodePos(T)&v,const T& e,BinNodePos(T)hot)
{if(v==null||v->data=e){return v;}//递归基hot=v;                          //当前非空节点BinNodePos(T)next=(v->data>e)?v->lc:v->rc;//根据当前节点的大小确定下一次搜索的转向return BST_Search1(next,e,hot); //递归查找
}

上述是查找算法的递归实现,接口语义是hot指向被查找到的那个节点的父亲,若在树中没找到该节点,则hot为最后一个试图转向的节点。

BinNodePos(T) BST_Search2(BinNodePos(T)&v,const T& e,BinNodePos(T)hot)
{while(true){if(v->data==e||v==NULL)return v;else if(v->data>e) {hot=v;v=v->lc;}else{hot=v;v=v->rc;}}return v;
}

BST的插入算法

得益于BST查找算法良好的语义接口,BST的插入算法很容易实现。

template<typename T>
BinNodePos(T)BST<T>::insert(const T &e)
{BinNodePos(T) hot;BinNodePos(T) &x=BST_Search(_root,e,hot);if(!x){x=new BinNode<T>(e,hot);_size++;updateHeightAbove(x)}return x;
}

BST的删除

BST的删除有些复杂,分为两种情况:

(1)删除的节点没有左孩子或者是没有右孩子,此时直接把另一个非空的子节点取代删除节点即可。

(2)删除的节点既有左孩子,也有右孩子

为了保证BST的顺序性,此时应该用待删除节点的下一个节点(指中序序列中)取代待删除节点,并且调整节点间的父子关系。

BinNodePos(T) BST_Remove(BinNodePos(T)&x,BinNodePos(T)&hot)
{BinNodePos(T)w=x;BinNodePos(T)succ=null;if(!x->HasLChild)succ=w->rc;else if(!x->HasRChild)succ=w->lc;else{BinNOdePos(T)pc=w->rc;while(true)//迭代找到待删除节点的下一个节点{if(pc==null){succ=pc->parent;}pc=pc->lc;}}swap(w->data,succ->data);//交换待删除节点和下一个节点的数据;if(succ->parent==w)//如果待删除节点是下一个节点的父亲(当待删除节点的右子节点没有左子时){w->rc=succ->rc;}else//非第一种情况{succ->parent->lc=succ->rc;//succ->rc->parent=succ->parent;}hot=w->parent;//hot为待删除节点之父if(succ)succ->parent=hot;Release(x);Rease(x->data);return succ;
}

BST的概念,以及查找,插入,删除算法相关推荐

  1. BST 递归实现二叉树: 插入 删除 查找

    二叉树遍历: 前序遍历: 本身 左子树 右子树 中序遍历: 左子树 本身 右子树 从小到大排列 后续遍历: 左子树 右子树 本身 二叉树前驱: 当前节点左子树最大的节点 二叉树后继: 当前节点右子树最 ...

  2. 0202插入删除-算法第四版红黑树-红黑树-数据结构和算法(Java)

    文章目录 4 插入 4.1 序 4.2 向单个2-结点插入新键 4.3 向树底部的2-结点插入新键 4.4 向一棵双键树(3-结点)中插入新键 4.5 颜色调整 4.6 根结点总是黑色 4.7 向树底 ...

  3. 【数据结构与算法】实验 编写双链表的结点查找和删除算法

    Experiment 1 Linked List(4 hours) Prerequisites: Students should have mastered the following prerequ ...

  4. 进程句柄表初始化,扩展,插入删除句柄源码分析

    一.为什么要有句柄 句柄是一个8字节的结构体,用途是指向内核对象.3环程序无法通过地址直接访问内核对象,所以需要用句柄来间接访问. 本文重点介绍句柄表,句柄本身则留到下一篇博客介绍.但因为接下来介绍句 ...

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

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

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

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

  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 ...

最新文章

  1. 你的斗地主能拿多少炸?
  2. SpringBoot-hello world
  3. 类与类之间调用Computer-CPU-Mouse--看懂它看懂类之间的调用
  4. 黄聪:如何使用CodeSmith批量生成代码(原创系列教程)
  5. thinkphp5 消息队列thinkphp-queue扩展
  6. API网关Ocelot 使用Polly 处理部分失败问题
  7. java lock 信号_java各种锁(ReentrantLock,Semaphore,CountDownLatch)的实现原理
  8. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第16篇]描述DSA、Schnorr和RSA-FDH的密钥生成、签名和验证算法。
  9. HTML5学习笔记(二)
  10. python定义变量_Python基础 变量的基本使用
  11. Vue学习笔记之13-webpack的配置 傻子看了都会配置的超详细教程
  12. 资源下载网站整站资源|建站6万资源数据32G整站下载
  13. 服务器调用税务数字系统失败,终于等到你!网上报税常见问题解决方案大集锦!!!...
  14. html自定义文本框,JavaScript自定义文本框光标
  15. 计算机网络ping所有用法,电脑Ping命令的使用大全
  16. Python3编写炸金花游戏--超详细的讲解!!
  17. a标签中的href=javascript
  18. 2018-8-10-WPF-修改图片颜色
  19. 爆火的ChatGPT到底能做什么?5分钟带你进入AI的大门
  20. Vue----登录主页动态背景短视频制作

热门文章

  1. 前端静态资源请求和加载优化总结
  2. 海盗喝酒 蓝桥杯试题
  3. (包教包会)使用网络爬虫的方式获取国内376个城市的每日天气情况,并实现自动给自己发邮件
  4. Ubuntu 常用软件记录
  5. 设计模式-陈词滥调的单例
  6. 完美国际状态ID及对应说明!
  7. linux——sort uniq
  8. 代码随想录第25天 | 216. 组合总和III、17. 电话号码的字母组合
  9. 微信小程序中使用icon font图标
  10. 百度前端技术学院D1