定义:
二叉查找树要么是一棵空树,要么是一棵具有如下性质的非空二叉树:
     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. 日志之再说Log4J

    网上关于LOG4J的使用文章太多了,写这篇文章的目的一方面是为了回顾LOG4J的用法,一方面针对配置的使用自动将日志插入数据库,自动发送邮件,还有就是自定义输入实现.后续文章会总结下从LOG4J到LO ...

  2. openwrt的GPIO控制

    为什么有些GPIO可以在/sys/class/gpio中控制,而有些不行呢? 先来看一看普通不需要C程序而是使用脚本的控制方法(Linux普遍适用): First step is making GPI ...

  3. __declspec(novtable)keyword

    __declspec (novtable )keyword,表示这个类不生成虚函数表.可是继承类不影响(无论基类是否使用了keyword). 不使用此keyword.类在生成对象时构造函数和析构函数多 ...

  4. Android AES加密算法,现在实际上

    昨天,老板让我来看看android加密算法.于是在网上找了找,发现AES加密算法.(当然,MD5,BASE64什么http://snowolf.iteye.com/blog/379860这篇文章列举了 ...

  5. Restful WebApi开发实践

    随笔分类 - Restful WebApi开发实践   C#对WebApi数据操作 摘要: ## 目标简化并统一程序获取WebApi对应实体数据的过程,方便对实体进行扩充.原理就是数据服务使用反射发现 ...

  6. C#动态表达式计算(续2)

    上两篇废话太多,这一次我就不多说了,由于代码比较简单,可以直接从https://github.com/scottshare/DynamicExpress.git地址下载. 以下说明一下使用方法: Dy ...

  7. 刚下载的几个开源的Android项目

    Android-Universal-Image-Loader Android上最让人头疼的莫过于从网络获取图片.显示.回收,任何一个环节有问题都可能直接OOM,这个项目或许能帮到你. Universa ...

  8. QQ三方登录步骤详解

    首先,登录QQ互联:http://connect.qq.com/intro/login  ,注册成为开发者 选择申请加入,并创建你的应用. 创建成功后可以获取到appid和appkey 在网站的主页引 ...

  9. Remote验证及其改进(附源码)

    Remote验证及其改进(附源码) 表单中的输入项,有些是固定的,不变的验证规则,比如字符长度,必填等.但有些是动态的,比如注册用户名是否存在这样的检查,这个需要访问服务器后台才能解决.这篇文章将会介 ...

  10. DLL文件的引用

    首先我们先要写一个DLL文件: 我先创建一个win32的DLL工程,在工程中添加了Math.h和Math.cpp文件,具体内容如下: Math.h: #pragma once #include &qu ...