二叉搜索树

  • 概念
  • 特点
  • 基本操作
    • 1.插入元素
    • 2.查找元素
    • 3.删除元素

概念

二叉搜索树是一种特殊的二叉树

特点

左子树中的值都小于根节点,右子树中的值都大于根节点
故:中序遍历结果就会得到一个有序序列

最大的特点:就是能够高效的进行查找元素
查找过程类似于二分查找:先从根节点出发开始比较,看待查找元素是小于根节点还是大于根节点,进一步决定是去左子树中找,还是右子树
查找的时间复杂度:O(N) (单支树)

解决方案:采取更加平衡的二叉搜索树,AVL树(绝对平衡),红黑树

基本操作

1.插入元素

其实和查找非常相似,需要先找到待插入元素的合适位置
若树为空树,直接插入为根节点即可

对于二叉搜索树来说,插入元素的时候,元素都是被插入到叶子节点上的

2.查找元素

也很简单,简单画图理解即可~

3.删除元素

需要考虑很多种不同的情况:

  • 情况1:待删除元素是父节点的左子树
    且,待删除元素左子树为空,右子树非空

直接让父节点的左子树,指向待删除元素的右子树即可

  • 情况2:待删除元素是父节点的右子树
    待删除元素的左子树为空,右子树非空

直接让父节点的右子树,指向待删除节点的右子树即可

  • 情况3:待删除元素是父节点的左子树
    待删除元素左子树非空,右子树为空

直接将父节点的左子树,指向待删除结点的左子树即可

  • 情况4:待删除元素是父节点的右子树
    待删除元素左子树非空,右子树为空

直接将父节点的右子树,指向待删除结点的左子树即可

  • 情况5:待删除元素是父节点的左子树
    待删除元素左 / 右子树均非空

  • 情况6:待删除元素是父节点的右子树
    待删除元素左 / 右子树均非空


代码实现:

public class BinarySearchTree {public static class Node{int key;Node left;Node right;public Node(int key) {this.key = key;}}// 根节点  root 为null,表示为空树private Node root = null;//查找操作public Node find(int key){// 查找 key 是否存在// 若存在,返回对应的Node// 若不存在,返回nullNode cur = root;while (cur != null){if(key < cur.key){//此时去左子树中找cur = cur.left;}else if(key > cur.key){// 此时去右子树找cur = cur.right;}else{// 找到了return cur;}}// key 不存在return null;}//插入操作public boolean insert(int key){// 二叉搜索树中 是不允许存在相同 key 的元素的// 若新插入的 key 重复,就插入失败,返回 false// 插入成功 返回 true// 空树判断if(root == null){root = new Node(key);return true;}//先找到合适的位置,再去插入元素Node cur = root;// 让 parent 始终指向 cur 的父节点Node parent = null;while (cur != null){if(key < cur.key){parent = cur;cur = cur.left;}else if(key > cur.key){parent = cur;cur = cur.right;}else{// 某个元素和待插入元素值相同return false;}}// 循环结束,cur 指向 null// 当前元素就要插到 parent 子树的位置上if(key < parent.key){parent.left = new Node(key);}else{parent.right = new Node(key);}return true;}//删除操作public boolean remove(int key){// 先找到 待删除节点的位置,再进行删除// 找到待删除元素后,再来判断是那种情况Node cur = root;Node parent = null;while (cur != null){if(key < cur.key){parent = cur;cur = cur.left;}else if(key > cur.key){parent = cur;cur = cur.right;}else{// 找到了 待删除元素,就是 cur 指向的元素removeNode(parent,cur);return true;}}return false;}private void removeNode(Node parent, Node cur) {// 1.待删除元素左子树为空if(cur.left == null){//1.1 若要删除节点为 rootif(cur == root){root = cur.right;}//1.2 cur 是 parent 的左子树else if(cur == parent.left){parent.left = cur.right;}//1.3 cur 是 parent 的右子树else{parent.right = cur.right;}}// 2.待删除元素右子树为空else if(cur.right == null){//2.1 若要删除节点为 rootif(cur == root){root = cur.left;}//2.2 cur 是 parent 的左子树else if(cur == parent.left){parent.left = cur.left;}//2.3 cur 是 parent 的右子树else{parent.right = cur.left;}}// 3.待删除节点有两个子树else{// ①找到右子树的最小元素 / 左子树的最大元素(替罪羊)Node goatParent = cur;Node scapeGoat = cur.right;while (scapeGoat.left != null){goatParent = scapeGoat;scapeGoat = scapeGoat.left;}// 当循环结束时,scapeGoat 指向了右子树中的最小值// ②将找到的元素,赋值给待删除节点cur.key = scapeGoat.key;// ③删除替罪羊节点// 替罪羊节点一定没有左子树if(scapeGoat == goatParent.left){goatParent.left = scapeGoat.right;}else{goatParent.right = scapeGoat.right;}}}
}

插入测试:

public static void main(String[] args) {BinarySearchTree tree = new BinarySearchTree();tree.insert(9);tree.insert(5);tree.insert(2);tree.insert(7);tree.insert(3);tree.insert(6);tree.insert(8);//为了查看树的结构,可以打印树的先序和中序遍历结果tree.preOrder(tree.root);System.out.println();tree.inOrder(tree.root);
}// 先序遍历
public void preOrder(Node root){if(root == null){return;}System.out.print(root.key + " ");preOrder(root.left);preOrder(root.right);
}
// 中序遍历
public void inOrder(Node root){if(root == null){return;}inOrder(root.left);System.out.print(root.key + " ");inOrder(root.right);
}

输出结果:


根据先 、中序遍历结果,来还原二叉树,得到:


调试代码:

得到的结果和我们图上还原的结果一样


二叉搜索树 【数据结构】相关推荐

  1. 算法篇 - 二叉搜索树

    前言 在前端的工作当中,二叉搜索树不怎么常见,虽然没有快排.冒泡.去重.二分.希尔等算法常见,但是它的作用,在某些特定的场景下,是非常重要的. 目前es6的使用场景比较多,所以我准备能用es6的地方就 ...

  2. 数据结构之二叉搜索树(BST)

    数据结构之二叉搜索树(BST) 1. 二叉搜索树定义 二叉搜索树(Binary Search Tree),又名二叉排序树(Binary Sort Tree). 二叉搜索树是具有有以下性质的二叉树: ( ...

  3. 数据结构之二叉搜索树/二叉查找数/有序二叉树/排序二叉树

    概念~ 二叉查找树(英语:Binary Search Tree),也称二叉搜索树.有序二叉树(英语:ordered binary tree),排序二叉树(英语:sorted binary tree), ...

  4. 数据结构与算法 整理笔记---二叉搜索树

    二叉搜索树 查找问题是计算机中非常重要的基础问题 二分查找法 对于有序数组,才能使用二分查找法(排序作用) public class BinarySearch {public static int b ...

  5. 数据结构与算法笔记(十六)—— 二叉搜索树

    一.二叉搜索树定义 二叉搜索树(Binary Search Tree),又名二叉排序树(Binary Sort Tree). 二叉搜索树是具有有以下性质的二叉树: 若左子树不为空,则左子树上所有节点的 ...

  6. 数据结构与算法(3)——树(二叉、二叉搜索树)

    前言:题图无关,现在开始来学习学习树相关的知识 前序文章: 数据结构与算法(1)--数组与链表(https://www.jianshu.com/p/7b93b3570875) 数据结构与算法(2)-- ...

  7. 数据结构:二叉搜索树(BST)的基本操作

    概述 学习过数据结构的童鞋都应该知道,对树的操作是一些最基本的技能(本文是对后面要写B树.B-树.B+树的一个前导,已经熟悉的朋友可以跳过了).而在树结构中,二叉树又是最基础的.虽然这些知识是比较基础 ...

  8. 数据结构与算法之二叉搜索树

    与链表不同,树是一种非线性的数据结构.树中最常用的是二叉树,二叉树限制了子树的数量,也就是每个结点的子树至多2个,并且这两个子树是有顺序的.而二叉搜索树(二叉查找树,二叉排序树)是指根节点的关键字大于 ...

  9. 数据结构与算法--力扣109题将有序双向链表转换为二叉搜索树

    将有序数组转换为二叉搜索树 近一年都比较关注算法相关的知识,也刷了不少题,之前的文章中大多也是算法相关的文章,但是感觉每次遇到树相关的题型都不能应对自如,因此还是有必要在相关知识上下功夫,因此有此次总 ...

  10. 数据结构与算法--力扣108题将有序数组转换为二叉搜索树

    力扣108提将有序数组转换为二叉搜索树 近一年都比较关注算法相关的知识,也刷了不少题,之前的文章中大多也是算法相关的文章,但是感觉每次遇到树相关的题型都不能应对自如,因此还是有必要在相关知识上下功夫, ...

最新文章

  1. c语言 结构成员 变量引用,C++结构体变量的引用
  2. 不会这些基础命令,白做运维了
  3. python在abaqus中的应用代码下载_Python-(source-code)-in--Abaqus Python语言在Abaqus中的应用(源码) - 下载 - 搜珍网...
  4. step2 . day2 Linux基础命令和常用知识汇总
  5. OC2_点语法(属性关键字)
  6. H.264中POC类型之探讨
  7. [hihoCoder 1384]Genius ACM
  8. python搭建环境的心得体会_python学习第一天_环境的搭建
  9. onvif device manager 找不到ipc_Qt音视频开发32-Onvif网络设置
  10. Palindrome Degree(hash的思想题)
  11. L1-039 古风排版 (20 分)—团体程序设计天梯赛
  12. 查找php超时原因_php环境搭建(正确配置nginx和php)
  13. 微信小程序背景图片如何设置--如何用background-image Base64设置背景
  14. 帆软客户画像分析与客户价值模型
  15. 从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队。如果该 年没有举办世界杯,则输出:没有举办世界杯。...
  16. 光影mod_我的世界:mc十大“最受欢迎”mod,知道半数以上,实为老玩家
  17. 营养与心理的眼睛保健方法
  18. 杭电1069 Monkey and Banana
  19. Python性能分析,Python可是无所不能的!
  20. 用ffmpeg进行音频格式转换、剪切、合并、音量调整等

热门文章

  1. 我为什么喜欢周六来加班?
  2. 十大常用前端UI组件库
  3. 斐讯dns服务器未响应,斐讯(phicomm)路由器怎么隐藏wifi信号?
  4. 多任务学习综述Multi-Task Deep Recommender Systems
  5. C++实现Point类
  6. OA办公软件哪个好用?
  7. java SE基础知识
  8. (二)基于文本的QA问答系统——深度检索模型概述
  9. php开发买macbook后悔,先别吵,这是我们上手 MacBook Pro 后的真实感受
  10. AISG RCU ACU 电调天线远端控制器