定义:
二叉查找树要么是一棵空树,要么是一棵具有如下性质的非空二叉树:
     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. web中国的数据分析过程

    1 获得web原始数据 2 确定数据编码 例如:是不是url编码或base64编码 3 如果有必要的解码编码 4 确定原始数据和本地字符集显示字符集 5 字符集转换 6 显示 版权声明:本文博客原创文 ...

  2. IE8下div中2个button仅仅显示一个

    IE8下div中2个button仅仅显示一个,代码例如以下: <div id="adviceType" style="display: none;" &g ...

  3. Linux解决:svn: Can&#39;t connect to host &#39;*.*.*.*&#39;: 因为连接的方没有正确回答或连接在以后的时间

    svn服务启动,在server在可使用命令将文件检查,但它不能检测其他计算机.已经提出: "svn: Can't connect to host '*.*.*.*': 因为连接方在一段时间后 ...

  4. leetcode[158] Read N Characters Given Read4 II - Call multiple times

    想了好一会才看懂题目意思,应该是: 这里指的可以调用更多次,是指对一个文件多次操作,也就是对于一个case进行多次的readn操作.上一题是只进行一次reandn,所以每次返回的是文件的长度或者是n, ...

  5. hibernate配置jndi

    tomcat里的conf->context.xml <Resource name="mysql"     auth="Container" type ...

  6. gulp package.json

    { "name": "gulpAngular1", "version": "0.0.0", "dependen ...

  7. 如何在网页启动Windows服务

    由于公司有许多windows服务进行业务的处理,所以对服务的维护也是一个比较头痛的问题,因为自己也不知道服务什么时候自动停了,而且更主要的原因是服务都是由运维部门在维护管理,开发这边没有直接操作服务的 ...

  8. 几个 jQuery 小提示和技巧

    几个 jQuery 小提示和技巧 今天,我们将分享一些很有用的技巧和窍门给 jQuery 开发人员.jQuery 是最好的 JavaScript 库之一,用于简化动画,事件处理,支持 Ajax 和 H ...

  9. Plan : 破晓

    题记 : 不要因为走的太远而忘记自己为什么而出发. 1. 白书(算法竞赛入门经典)看完(每一句话都要读懂) 2. 每次听完课把当天内容复习完(自习室10点以后复习) 3. 微机实验要提前预习(把实验报 ...

  10. exit与_exit

    一.main函数: 先从程序的执行开始谈起,C程序总是从main函数开始执行,当内核执行C程序时(使用了一个exec函数),在调用main函数前先调用一个特殊的启动例程.可执行程序 文件将此启动例程指 ...