二叉搜索树
创始人
2024-01-16 23:06:07
0

文章目录

  • 二叉搜索树
  • 1. 概念
  • 2. 模拟实现二叉搜索树
    • 2.1 准备工作 创建类
    • 2.2 查找方法
    • 2.3 插入方法
    • 2.4 删除方法
  • 3. 性能分析

二叉搜索树


前言 :

在这里插入图片描述

1. 概念


二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:

  • 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
  • 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
  • 它的左右子树也分别为二叉搜索树

在这里插入图片描述

概念啥的看看就行了,之前二叉树的时候可能就已经见过了, 下面我们直接来实现我们自己的二叉搜索树

2. 模拟实现二叉搜索树

2.1 准备工作 创建类


这里我们创建一个 BinarySearchTree 和 内部类 TreeNode
在这里插入图片描述

2.2 查找方法

在这里插入图片描述


代码实现 :

查找功能就完成了,下面完成插入方法

2.3 插入方法

在这里插入图片描述


补充: 这里我们 假设我们的二叉搜索树是一颗完全二叉树,那么这里我们插入的时间复杂度是不是就是O(logN)

在这里插入图片描述


单分支的情况 加 了解 AVL 树
在这里插入图片描述


补充 : 这里忘记 讲 了 这里 二叉搜索树是空树的情况,那么我们直接让 root = new TreeNode(val) 即可,创建第一个节点


最终代码 :

 public boolean insert(int val) {if (root == null) {root = new TreeNode(val);}TreeNode cur = root;//定义一个 parent 指向 cur的 上一个根节点TreeNode parent = null;while (cur != null) {if (cur.val < val) {parent = cur;cur = cur.right;} else if (cur.val > val) {parent = cur;cur = cur.left;} else {return false;}}// 此时判断 当前的val 是大于 parent.val 还是小于if (parent.val < val) {// 此时 根据二叉搜索树的性质大于根 放在右树parent.right = new TreeNode(val);}if (parent.val > val) {// 此时 val 小于 parent.val 插入左树parent.left = new TreeNode(val);}return true;}

下面就来学习一下,二叉搜索树中难一点的方法删除

2.4 删除方法

删除操作,算我们实现二叉搜索树中唯一难一点的操作这里需要分三种情况

图一:

在这里插入图片描述


图二 : cur.left == null

在这里插入图片描述


图三 : cur.right == null

在这里插入图片描述


图四 : cur.left != null && cur.right != null

在这里插入图片描述


这里在右树中找最小的 可以自己画图分析 ,因为是一样的, 这里就留一个作业, 或者看下面的代码实现, 我们图是以找左树最大的,代码以找右树最小的 。


图一 :
在这里插入图片描述


图二 :

在这里插入图片描述


删除总代码:

 // 写一个方法找到我们需要删除的节点 和 根节点public void remove(int key) {//找 parent 和 cur 节点TreeNode cur = root;TreeNode parent = null;while (cur != null) {if (cur.val < key) {parent = cur;cur = cur.right;} else if (cur.val > key) {parent = cur;cur = cur.left;} else {// 此时找到了我们的 cur ,和 parentremoveNode(cur, parent);break;}}}public void removeNode(TreeNode cur, TreeNode parent) {// 1. 当 cur.left == null  的情况if (cur.left == null) {// 此时又分为三种情况if (cur == root) {root = root.right;// cur.left == null ,所以直接让 root 等于右树} else if (parent.left == cur) {// 根据图的分析,parent.left = cur.right;} else {// 此时 parent.right = curparent.right = cur.right;}} else if (cur.right == null) {// 此时 cur.right 同样有三种情况if (cur == root) {root = root.left;} else if (parent.left == cur) {parent.left = cur.left;} else {// parent.right = curparent.right = cur.left;}} else {// cur.left != null && cur.right != null  这里我们使用方法二// 在cur的右树中找 最小的TreeNode parentDummy = cur;TreeNode curDummy = cur.right;while (curDummy.left != null) {parentDummy = curDummy;curDummy = curDummy.left;}cur.val = curDummy.val;// 此时找到了最小的 判断两种情况即可//  curDummy.left == nullif (parentDummy.left == curDummy) {parentDummy.left = curDummy.right;} else {//parentDummy.right = curDummyparentDummy.right = curDummy.right;}}}

此时我们的二叉搜索的 查找新增删除方法就完成了.

附上代码:

public class BinarySearchTree {static class TreeNode {public int val;public TreeNode left;public TreeNode right;public TreeNode(int val) {this.val = val;}}public TreeNode root;public TreeNode search(int key) {TreeNode cur = root;while (cur != null) {if (cur.val < key) {// 此时 key 大于 根进入 右树找cur = cur.right;} else if (cur.val > key) {// 此时 ken 小于 根进入 左树找cur = cur.left;} else {// 此时说明找到了 返回 当前节点地址;return cur;}}// 此时说明没有找到return null;}public boolean insert(int val) {if (root == null) {root = new TreeNode(val);}TreeNode cur = root;//定义一个 parent 指向 cur的 上一个根节点TreeNode parent = null;while (cur != null) {if (cur.val < val) {parent = cur;cur = cur.right;} else if (cur.val > val) {parent = cur;cur = cur.left;} else {return false;}}// 此时判断 当前的val 是大于 parent.val 还是小于if (parent.val < val) {// 此时 根据二叉搜索树的性质大于根 放在右树parent.right = new TreeNode(val);}if (parent.val > val) {// 此时 val 小于 parent.val 插入左树parent.left = new TreeNode(val);}return true;}// 写一个方法找到我们需要删除的节点 和 根节点public void remove(int key) {//找 parent 和 cur 节点TreeNode cur = root;TreeNode parent = null;while (cur != null) {if (cur.val < key) {parent = cur;cur = cur.right;} else if (cur.val > key) {parent = cur;cur = cur.left;} else {// 此时找到了我们的 cur ,和 parentremoveNode(cur, parent);break;}}}public void removeNode(TreeNode cur, TreeNode parent) {// 1. 当 cur.left == null  的情况if (cur.left == null) {// 此时又分为三种情况if (cur == root) {root = root.right;// cur.left == null ,所以直接让 root 等于右树} else if (parent.left == cur) {// 根据图的分析,parent.left = cur.right;} else {// 此时 parent.right = curparent.right = cur.right;}} else if (cur.right == null) {// 此时 cur.right 同样有三种情况if (cur == root) {root = root.left;} else if (parent.left == cur) {parent.left = cur.left;} else {// parent.right = curparent.right = cur.left;}} else {// cur.left != null && cur.right != null  这里我们使用方法二// 在cur的右树中找 最小的TreeNode parentDummy = cur;TreeNode curDummy = cur.right;while (curDummy.left != null) {parentDummy = curDummy;curDummy = curDummy.left;}cur.val = curDummy.val;// 此时找到了最小的 判断两种情况即可//  curDummy.left == nullif (parentDummy.left == curDummy) {parentDummy.left = curDummy.right;} else {//parentDummy.right = curDummyparentDummy.right = curDummy.right;}}}public void inorder(TreeNode root) {if (root == null) {return;}// 中序遍历 左 -> 根 -> 右inorder(root.left);System.out.print(root.val + " ");inorder(root.right);}
}


下面我们测试一下

在这里插入图片描述

完美

3. 性能分析

插入和删除操作都必须先查找,查找效率代表了二叉搜索树中各个操作的性能。

对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多。

但对于同一个关键码集合,如果各关键码插入的次序不同,可能得到不同结构的二叉搜索树

在这里插入图片描述


最优情况下,二叉搜索树为完全二叉树,其平均比较次数为:

最差情况下,二叉搜索树退化为单支树,其平均比较次数为:

问题:如果退化成单支树,二叉搜索树的性能就失去了。那能否进行改进,不论按照什么次序插入关键码,都可以

是二叉搜索树的性能最佳?

这里学习二叉搜索树 ,主要是为下文的 SetMap 做准备

TreeMap 和 TreeSet 即 java 中利用搜索树实现的 Map 和 Set;实际上用的是红黑树,而红黑树是一棵近似平衡的

二叉搜索树,即在二叉搜索树的基础之上 + 颜色以及红黑树性质验证,这里红黑树比较难,需要我们知识的沉淀 ,那么再后续再来说我们的AVL树和红黑树…

下文 : Map 和 Set

相关内容

热门资讯

常用商务英语口语   商务英语是以适应职场生活的语言要求为目的,内容涉及到商务活动的方方面面。下面是小编收集的常用商务...
六年级上册英语第一单元练习题   一、根据要求写单词。  1.dry(反义词)__________________  2.writ...
复活节英文怎么说 复活节英文怎么说?复活节的英语翻译是什么?复活节:Easter;"Easter,anniversar...
2008年北京奥运会主题曲 2008年北京奥运会(第29届夏季奥林匹克运动会),2008年8月8日到2008年8月24日在中华人...
英语道歉信 英语道歉信15篇  在日常生活中,道歉信的使用频率越来越高,通过道歉信,我们可以更好地解释事情发生的...
六年级英语专题训练(连词成句... 六年级英语专题训练(连词成句30题)  1. have,playhouse,many,I,toy,i...
上班迟到情况说明英语   每个人都或多或少的迟到过那么几次,因为各种原因,可能生病,可能因为交通堵车,可能是因为天气冷,有...
小学英语教学论文 小学英语教学论文范文  引导语:英语教育一直都是每个家长所器重的,那么有关小学英语教学论文要怎么写呢...
英语口语学习必看的方法技巧 英语口语学习必看的方法技巧如何才能说流利的英语? 说外语时,我们主要应做到四件事:理解、回答、提问、...
四级英语作文选:Birth ... 四级英语作文范文选:Birth controlSince the Chinese Governmen...
金融专业英语面试自我介绍 金融专业英语面试自我介绍3篇  金融专业的学生面试时,面试官要求用英语做自我介绍该怎么说。下面是小编...
我的李老师走了四年级英语日记... 我的李老师走了四年级英语日记带翻译  我上了五个学期的小学却换了六任老师,李老师是带我们班最长的语文...
小学三年级英语日记带翻译捡玉... 小学三年级英语日记带翻译捡玉米  今天,我和妈妈去外婆家,外婆家有刚剥的`玉米棒上带有玉米籽,好大的...
七年级英语优秀教学设计 七年级英语优秀教学设计  作为一位兢兢业业的人民教师,常常要写一份优秀的教学设计,教学设计是把教学原...
我的英语老师作文 我的英语老师作文(通用21篇)  在日常生活或是工作学习中,大家都有写作文的经历,对作文很是熟悉吧,...
英语老师教学经验总结 英语老师教学经验总结(通用19篇)  总结是指社会团体、企业单位和个人对某一阶段的学习、工作或其完成...
初一英语暑假作业答案 初一英语暑假作业答案  英语练习一(基础训练)第一题1.D2.H3.E4.F5.I6.A7.J8.C...
大学生的英语演讲稿 大学生的英语演讲稿范文(精选10篇)  使用正确的写作思路书写演讲稿会更加事半功倍。在现实社会中,越...
VOA美国之音英语学习网址 VOA美国之音英语学习推荐网址 美国之音网站已经成为语言学习最重要的资源站点,在互联网上还有若干网站...
商务英语期末试卷 Part I Term Translation (20%)Section A: Translate ...