定义:
二叉查找树要么是一棵空树,要么是一棵具有如下性质的非空二叉树:
     1.若左子树非空,则左子树上的所有结点的关键字值均小于根结点的关键字值。
     2.若右子树非空,则右子树上的所有结点的关键字值均大于根结点的关键字值。
     3.左、右子树本身也分别是一棵二叉查找树(二叉排序树)
 

 
 
 
支持的操作:
     search(x,k),  //在以x为根的BST中查找关键值k是否存在
     insert(x,k),   //在以x为根的BST中插入关键字为k的结点
     remove(x,k),     //在以x为根的BST中删除关键字为k的结点。
            三种情况:无子(直接删掉)、有1子(将子结点和父结点相连)、有2子(将node的值设置为它后继的值,删除node的后继)
     max(x),    //返回以x为根的BST中最大的关键值
     min(x),    //返回以x为根的BST中最小的关键值
     successor(x)  (返回x结点的后继元素,中序遍历x结点之后输出的元素)     //2种情况:有右子(右子树的最小结点),无右子(向上找,第一个作为左儿子的父结点)
     predecessor(x)  (前驱元素,中序遍历x结点之前输出的元素)     //和找后继对称
所有操作时间复杂度都是O(h),h是树的高度
随机选择输入序列的元素插入BST,可得树高度期望是O(logn),可知随机化是接近最好情况的,不是接近最坏情况
 
对BST中节点按从小到大顺序遍历是对树的中序遍历    
递归算法时间复杂度O(n),空间复杂度O(n)
用栈迭代算法时间复杂度O(n),空间复杂度O(n)
 
非常牛逼的遍历方式
Morris Traversal :O(1)空间复杂度,O(n)时间复杂度,中序遍历二叉树(不用栈,不递归遍历)
步骤:
     1.若当前节点r无左子,输出当前节点,当前节点变为原当前节点的右子(r = r->right)
     2.若当前节点有左子,在左子树内找到当前节点的中序前驱pre。
           a) 若前驱节点pre的右子为null,将pre->right设为当前节点r,当前节点变为当前节点的左子(r=r->left)
           b) 若前驱节点pre的右子为当前节点r,将pre->right还原为null,输出当前节点r,当前节点变为当前节点的右子(r = r->right )
 vector < int> inorderTraversal2 (TreeNode * root ){
  //Morris traversal
  TreeNode * curr = root,* pre ;
while ( curr != nullptr){
  if ( curr ->left == nullptr ){
  sortedVect .push_back ( curr-> val );
curr = curr-> right ;
}
else {
  pre = curr-> left ;
while ( pre ->right != nullptr && pre-> right != curr) pre = pre-> right ;
if ( pre ->right == nullptr ){
   pre ->right = curr ;
curr = curr-> left ;
}
else {
  pre ->right = nullptr ;
  sortedVect .push_back ( curr-> val );
  curr = curr-> right ;
}
}
}
return sortedVect ;
}

BST 二叉搜索树的更多相关文章

  1. 数据结构中很常见的各种树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)

    数据结构中常见的树(BST二叉搜索树.AVL平衡二叉树.RBT红黑树.B-树.B+树.B*树) 二叉排序树.平衡树.红黑树 红黑树----第四篇:一步一图一代码,一定要让你真正彻底明白红黑树 --- ...

  2. [LeetCode] Serialize and Deserialize BST 二叉搜索树的序列化和去序列化

    Serialization is the process of converting a data structure or object into a sequence of bits so tha ...

  3. bst 二叉搜索树简单实现

    //数组实现二叉树: // 1.下标为零的元素为根节点,没有父节点 // 2.节点i的左儿子是2*i+1:右儿子2*i+2:父节点(i-1)/2: // 3.下标i为奇数则该节点有有兄弟,否则又左兄弟 ...

  4. 数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)

    树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: BST树 ...

  5. [LeetCode] Minimum Absolute Difference in BST 二叉搜索树的最小绝对差

    Given a binary search tree with non-negative values, find the minimum absolute difference between va ...

  6. 浅析BST二叉搜索树

    2020-3-25 update: 原洛谷日报#2中代码部分出现一些问题,详情见此帖.并略微修改本文一些描述,使得语言更加自然. 2020-4-9 update:修了一些代码的锅,并且将文章同步发表于 ...

  7. 530 Minimum Absolute Difference in BST 二叉搜索树的最小绝对差

    给定一个所有节点为非负值的二叉搜索树,求树中任意两节点的差的绝对值的最小值.示例 :输入:   1    \     3    /   2输出:1解释:最小绝对差为1,其中 2 和 1 的差的绝对值为 ...

  8. LeetCode #938. Range Sum of BST 二叉搜索树的范围和

    https://leetcode-cn.com/problems/range-sum-of-bst/ 二叉树中序遍历 二叉搜索树性质:一个节点大于所有其左子树的节点,小于其所有右子树的节点 /** * ...

  9. Leetcode938. Range Sum of BST二叉搜索树的范围和

    给定二叉搜索树的根结点 root,返回 L 和 R(含)之间的所有结点的值的和. 二叉搜索树保证具有唯一的值. 示例 1: 输入:root = [10,5,15,3,7,null,18], L = 7 ...

  10. 标准BST二叉搜索树写法

    本人最近被各种数据结构的实验折磨的不要不要的,特别是代码部分,对数据结构有严格的要求,比如写个BST要分成两个类,一个节点类,要给树类,关键是所以操作都要用函数完成,也就是在树类中不能直接操作节点,需 ...

随机推荐

  1. Spring之SpringMVC(源码)启动初始化过程分析

    1.说明 SpringMVC作为Spring提供的MVC实现,可以实现与Spring的天然无缝联合,因为具有很广泛的用途.具体的关于SpringMVC的处理流程逻辑我在这里就不在赘述了.还是来通过源码 ...

  2. HTML5学习资源

    http://www.silverlightchina.net/html/HTML_5/study/ 我们一起学:HTML5标签系列教程(一)-video标签 版权声明:本文博客原创文章.博客,未经同 ...

  3. 附加没有LDF的数据库文件

    原文:附加没有LDF的数据库文件 如果你只下载了数据文件,没有LDF文件,那么附加的时候选择使用ATTACH_REBUILD_LOG. 命令类似: USE [master] GO CREATE DAT ...

  4. HDInsight-Hadoop现实(两)传感器数据分析

    HDInsight-Hadoop现实(两)传感器数据分析 简要 现在,含传感器非常个人和商用设备收集来自物理世界的信息.例如.大多数手机都有 GPS.健身器材可以跟踪的步骤,你去数,恒温控制器可以监视 ...

  5. android shape总结 和控制的风格定制

    1:shape总结 1):shape文件是放置在drawable文件下的.res/drawable/filename.xml. 2):shape类型:android:shape. 一共同拥有四种:re ...

  6. 一道sql面试题(查询语句)

    一道sql面试题(查询语句)   id name age 1  a        11 2  b        11 3  c        12 4  d        13 5  e        ...

  7. ps入门教程:画笔工具、铅笔工具、渐变工具等的使用

    本节课程主要内容:学习画笔工具.铅笔工具.颜色替换工具.历史记录画笔工具.历史记录艺术画笔工具.渐变工具和油漆桶 工具的应用.------------------------------------- ...

  8. java中dao层的通用层,通过反射机制,操作数据库的增删改,适用的范围是不包含属性类

    这里首先必须注意的是:类的类名.字段必须与数据库中的表名和字段名保持一致,否则无法通过反射机制作出通用层 /** * 学生信息类,数据库中的StuInfo表 * */public class StuI ...

  9. WebActivator的实现原理详解

    WebActivator的实现原理详解 文章内容 上篇文章,我们分析如何动态注册HttpModule的实现,本篇我们来分析一下通过上篇代码原理实现的WebActivator类库,WebActivato ...

  10. [转]网上看到的关于C中内存分配的描述

    1栈   -   有编译器自动分配释放     2堆   -   一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收     3全局区(静态区),全局变量和静态变量的存储是放在一块的,初始 ...