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

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

Binary Search Tree(BST)

  • 或者是一棵空树;
  • 或者是具有下列性质的二叉树:
    • 对于任何一个结点,设其值为K
    • 则该结点的 左子树(若不空)的任意一个结点的值都 小于 K;
    • 该结点的 右子树(若不空)的任意一个结点的值都 大于 K;
    • 而且它的左右子树也分别为BST
  • 性质: 中序遍历是正序的(由小到大的排列)

检索

只需检索二个子树之一

  • 直到 K 被找到
  • 或遇上树叶仍找不到,则不存在

插入

  • 检索到不允许插入吧
  • 失败,则在该位置插入新叶,以保持BST的性质和性能

删除(值替换)

  • 先递归去找要删除的元素
  • 找到了,如果左右子树又一个为空,直接替换
  • 否则,找右子树的最小元素,进行值替换(把最小元素替换为右孩子,找到的元素的值替换为最小元素的值,最后内存释放最小元素)
void BST
:::remove(BinaryTreeNode
*& rt,const T val) { if(rt == NULL) cout<<"not in the tree"<
value()) remove(rt->leftChild(),val); else if(val > rt->value()) remove(rt->rightChild(),val); else { BinaryTreeNode *temp = rt; if(rt->leftChild == NULL) rt = tr->rightChild(); //直接替换就好了 else if(rt->rightChild == NULL) rt = rt->leftChild();//直接替换就好了 else { //左右子树都不为空,找到右子树的最小节点,然后替换该节点值 temp = deletemin(rt->rightChild()); rt->setValue(temp->value()); } }}//找右子树的最小节点template
BinaryTreeNode *BST::deletemin(BinaryTreeNode
*rt){ if(rt->leftChild() !=NULL) return deletemin(rt->leftChild()); else { //删除右子树中的最小节点 BinaryTreeNode *temp = rt; //找到了右子树中最左的节点,也就是右子树中最小的节点 rt = rt->rightChild(); //把最小节点替换为右子树 return temp; //这里返回引用,引用用完之后内存会被释放,很巧妙 }}复制代码

二叉搜索树总结

  • 组织内存索引
    • 二叉搜索树是适用于内存储器的一种重要的树形索引
      • 常用红黑树、伸展树等,以维持平衡
    • 外存常用B/B+树
  • 保持性质 vs 保持性能
    • 插入新结点或删除已有结点,要保证操作结束后仍符合二叉搜索树的定义

思考

若二叉搜索树中含有重复的元素,如何进行元素的插入和删除操作?

答:可以在每个节点增设一个标记位,标记当前该节点元素的个数。若要插入/删除的元素BST中已存在,则只需修改标记位的值即可。

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

你可能感兴趣的文章
最新全国手机号码归属地信息SQLite数据库2019年2月更新
查看>>
“寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
查看>>
Jackson 序列化对象成 JSON 字符串,忽略部分字段(属性)
查看>>
如何使用视频转换器将ogg格式转换为MP3格式
查看>>
深入理解express框架的匹配路由机制
查看>>
解决Jenkins可选插件列表为空提示“connect time out”问题
查看>>
Python如何读取文件
查看>>
Scrum:产品负责人责任
查看>>
js封装 Ajax ——常用工具函数
查看>>
webpack最小化lodash
查看>>
学习ET(2) - 替换角色的模型
查看>>
十大热门的JavaScript框架和库
查看>>
css中和模型及其相关的问题
查看>>
MyBatis 源码解析(一):初始化和动态代理
查看>>
技本功丨来~与你讲一段ES节点扩容、数据迁移的故事……
查看>>
有赞全链路压测实战
查看>>
网络协议 12 - HTTP 协议:常用而不简单
查看>>
AngularJS 多指令 Scope 问题
查看>>
MongoDB之我是怎么成为Primary节点的
查看>>
STF本地集成-for-Mac
查看>>