二叉排序树(BST)

二叉排序树,又称二叉查找树(BST)

左子树结点值<根节点值<右子树结点值

如果用中序遍历来遍历一棵二叉排序树的话,可以得到一个递增的有序数列

左根右

二叉排序树的查找

//二叉排序树结点
typedef struct BSTNode{
int key;
struct BSTNode *lchild,*rchild;
}BSTNode,*BSTree;

查找是非常方便的,目标值和根节点比较,如果相等则成功,比根节点大往右去,比根节点小往左去。

查找失败就返回null

非递归方式:

//在二叉排序树中查找值为key的结点
BSTNode *BST_search(BSTree T, int key){
while(T!=NULL&&key!=T->key){ //若树为空或等于根节点值,则结束循环
if(key<T->key){ //小于,则在左子树
T=T->lchild;
}else{ //大于,则在右子树
T=T->rchild;
}
}
return T;
}

最坏空间复杂度=O(1)

递归方式:

//在二叉排序树中查找值为key的结点(递归实现)
BSTNode *BSTSearch(BSTree T,int key){
if(T==NULL){
return NULL; //查找失败
}
if(key==T->key){
return T; //查找成功
}else if(key <T->key){
return BSTSearch(T->lchild,key); //在左子树找
}else{
return BSTSearch(T->rchild,key); //在右子树找
}
}

最坏空间复杂度=O(h) 和树的高度相同

二叉排序树的插入

若原二叉排序树为空,则直接插入结点;

否则,若关键字k小于根节点值,则插入到左子树,若关键字k大于根节点值,则插入到右子树。

//在二叉排序树插入关键字为k的新节点(递归实现)
int BST_Insert(BSTree &T,int k){
if(T == NULL){ //原树为空,新插入的结点为根节点
T=(BSTree)malloc(sizeof(BSTNode));
T->key = k;
T->lchild = T->rchild = NULL;
return 1; //返回1,插入成功
}else if(k == T->key){ //树中不能存在相同关键字的结点,插入失败
return 0;
}else if(k<T->key){ //插入到T的左子树
return BST_Insert(T->lchild,k);
}else{ //插入到T的右子树
return BST_Insert(T->rchild,k);
}
}

最坏空间复杂度=O(h)

二叉排序树的构造

其实就是不断插入新节点的过程

//按照str[]中的关键字序列建立二叉排序树
void Creat_BST(BSTree &T,int str[],int n){
T = NULL; //初始化时T为空树
int i = 0;
while(i<n){ //依次将每个关键字插入到二叉排序树
BST_Insert(T,str[i]);
i++;
}
}

不同的关键字序列可能得到同款二叉排序树,也可能得到不同款二叉排序树

二叉排序树的删除

先搜索找到目标结点:

(需要保证二叉排序书的特性——左子树结点值<根节点值<右子树结点值)

  • 若是被删除的结点z是叶节点,则直接删除,不会破坏二叉排序树的性质。

  • 若结点z只有一棵左子树或右子树,则让z的子树称为z父节点的子树,替代z的位置

  • 若结点z有左、右两棵子树,则令z的直接后继(或直接前驱)替代z,然后从二叉排序树中删去这个直接后继(或直接前驱),这样就转换成了第一或第二种情况。

进行中序遍历,可以得到一个递增的有序序列。

用右子树最小的值来替代被删除的值(最左下)

用左子树最大的值来替代被删除元素(最右下角)

查找效率分析

查找长度——在查找运算中,需要对比关键字的次数称为查找长度,反应了查找操作时间复杂度

查找成功的平均查找长度ASL(Average Search Length)

树高h,找到最下层的一个结点需要对比h次

最坏情况:每个节点只有一个分支,树高h=结点数n。平均查找长度=O(n)

最好情况:

n个结点的二叉树最小高度为

\[\lfloor log_2n \rfloor+1
\]

平均查找长度=

\[O(log_2n)
\]

查找失败

二叉排序树(BST)的更多相关文章

  1. 二叉排序树(BST)创建,删除,查找操作

    binary search tree,中文翻译为二叉搜索树.二叉查找树或者二叉排序树.简称为BST 一:二叉搜索树的定义 他的定义与树的定义是类似的,也是一个递归的定义: 1.要么是一棵空树 2.如果 ...

  2. 二叉排序树(BST)构造与应用

             二叉排序树(BST)构造与应用       本文取自<数据结构与算法>(C语言版)(第三版).出版社是清华大学出版社.       本博文作为学习资料整理. 源码是VC+ ...

  3. 【数据结构】简单谈一谈二分法和二叉排序树BST查找的比较

    二分法查找: 『在有序数组的基础上通过折半方法不断缩小查找范围,直至命中或者查询失败.』   二分法的存储要求:要求顺序存储,以便于根据下标随机访问   二分法的时间效率:O(Log(n))   二分 ...

  4. 二叉排序树BST代码(JAVA)

        publicclassTest{     publicstaticvoid main(String[] args){         int[] r =newint[]{5,1,3,4,6,7 ...

  5. 二叉排序树BST+求树深度算法

    #include "stdio.h" #include "malloc.h" typedef struct node { int key; struct nod ...

  6. 判断二叉树是否二叉排序树(BST)

    算法思想:由于二叉排序树的中序遍历可以得到一个有序的序列,因此,我们可以使用中序遍历进行求解. 代码如下: #include <stack> using namespace std; ty ...

  7. 哈夫曼树;二叉树;二叉排序树(BST)

    优先队列:priority_queue<Type, Container, Functional>Type 为数据类型, Container 为保存数据的容器,Functional 为元素比 ...

  8. 二叉排序树BST

    注意:对一个二叉排序树进行中序遍历时,得到的序列是一个按值从小到大排列的有序序列 查找性能的分析:

  9. 关于二叉排序树 BST

    #include<stdio.h> #include<stdlib.h> typedef struct node { double w; struct node *l,*r; ...

  10. 4.5---判断是否是二叉排序树BST(CC150)

    public boolean checkBST(TreeNode root) { return isBST(root, Long.MIN_VALUE, Long.MAX_VALUE); } publi ...

随机推荐

  1. 重闯Sqli-labs关卡第一天(1-4关)

    前言 之前暑假闯了很多关但是最近刷BUGku的题 遇到SQL注入题就凉... 垃圾的我只能继续硬着头皮重新再来学习,再来闯. 第一关:字符型注入 字符型注入就是注入点的数据类型是字符型.字符型注入与数 ...

  2. Oracle数据泵的导入和导出

    前言 今天王子要分享的内容是关于Oracle的一个实战内容,Oracle的数据泵. 网上有很多关于此的内容,但很多都是复制粘贴别人的,导致很多小伙伴想要使用的时候不能直接上手,所以这篇文章一定能让你更 ...

  3. 深度分析:理解Java中的多态机制,一篇直接帮你掌握!

    Java中的多态 1 多态是什么 多态(Polymorphism)按字面的意思就是"多种状态".在面向对象语言中,接口的多种不同的实现方式即为多态.用白话来说,就是多个对象调用同一 ...

  4. 全面解析RayFire的动态对象与静态对象

    我们在日常使用RayFire的过程中,接触得比较多的应该就是RayFire的对象设置了.RayFire的对象包含了动态对象.静态对象与休眠对象,其中动态对象.静态对象可以结合动力学.运动学概念设置动作 ...

  5. MathType中如何实现上下两行公式“=”号对齐

    作为功能强大的数学公式编辑器,MathType可以轻松输入各种复杂的公式和符号,与 Office 文档完美结合,显示效果超好,比 Office 自带的公式编辑器要强大很多,可以为办公文档.网页.桌面出 ...

  6. 在线思维导图Ayoa共享功能使用教程

    Ayoa是一个制作思维导图的软件,除了导图制作,小编在使用过程中还发现了一些令人惊喜的功能,这些功能使得Ayoa有了更大的亮点以吸引用户. 下面就为大家简单介绍几个小编认为Ayoa中较为实用的共享功能 ...

  7. 系统提供的dispatch方法

    h1, h2, h3, h4, h5, h6, p, blockquote { margin: 0; padding: 0 } body { font-family: "Helvetica ...

  8. php filesize不能统计临时文件

    文件上传时要统计上传的文件的大小,使用filesize('文件名')的时候,其中 的文件名就得是文件在本地的临时文件但是会出现一个错误显示成 filesize(): stat failed for D ...

  9. 【AcWing 99】激光炸弹——二维前缀和

    (题面来自AcWing) 一种新型的激光炸弹,可以摧毁一个边长为 R 的正方形内的所有的目标. 现在地图上有 N 个目标,用整数Xi,Yi表示目标在地图上的位置,每个目标都有一个价值Wi. 激光炸弹的 ...

  10. Java基础教程——方法引用

    方法引用 Lambda表达式的代码,是否可以再简洁?--方法引用 对象/类名::方法名 参数都不用写明. import java.util.function.Consumer; public clas ...