1、二叉排序树

二叉排序树:BST( Binary Sort( Search)Tree,又称二叉查找树(Binary Search Tree),亦称二叉搜索树。对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小右子节点的值比当前节点的值大

特别说明:如果有相同的值,可以将该节点放在左子节点或右子节点

比如针对前面的数据(7,3,10,12,5,1,9),对应的二叉排序树为:

2、二叉排序树的创建和遍历

一个数组创建成对应的二叉排序树,并使用中序遍历二叉排序树,比如:数组为Aray(7,3,10,12,5,1,9),创建成对应的二叉排序树为:

3、二叉排序树的删除

二叉排序树的删除情况比较复杂,有下面三种情况需要考虑:

  1. 删除叶子节点(比如:2,5,9,12)
  2. 删除只有一个子树的节点(比如:1)
  3. 删除有两个子树的节点(比如:7,3,10)

操作思路分析

4、二叉排序树的删除节点的代码实现

package binarysorttree;/*** Create with IntelliJ IDAE** @Author: JINLEI* @Description: 二叉排序树* @Date: 2022/3/15* @Time: 11:19**/
public class BinarySortTreeDemo {public static void main(String[] args) {int[] arr = {7,3,10,12,5,1,9,2};BinarySortTree binarySortTree = new BinarySortTree();//循环添加节点到二叉排序树for (int i = 0; i < arr.length; i++) {binarySortTree.add(new Node(arr[i]));}//中序遍历二叉排序树System.out.println("中序遍历二叉排序树");binarySortTree.infixOrder();//1 3 5 7 9 10 12//测试删除叶子节点//binarySortTree.delNode(2);//binarySortTree.delNode(5);//binarySortTree.delNode(9);binarySortTree.delNode(1);
//        binarySortTree.delNode(7);System.out.println("删除节点后");binarySortTree.infixOrder();}
}//创建二叉排序树
class BinarySortTree{private Node root;//查找要删除的节点public Node search(int value){if (root == null){return null;}else {return root.search(value);}}//查找父节点public Node searchParent(int value){if (root == null){return null;}else {return root.searchParent(value);}}/***编写一个方法* 返回以node为根节点的二叉排序树的最小节点的值* 删除node为根节点的二叉排序树的最小节点* @param node 传入的节点(当做二叉排序树的根节点)* @return 返回的以node为根节点的二叉排序树的最小节点的值*/public int delRightTreeMin(Node node){Node target = node;//循环的查找左节点,就回找到最小值while (target.left != null){target = target.left;}//这时target指向了最小节点//删除最小节点delNode(target.value);return target.value;}//删除节点public void delNode(int value){if (root == null){return;}else {//先去找到要删除的节点Node targetNode = search(value);//没有找到要删除的节点if(targetNode == null){return;}//如果发现当前的二叉排序树只有一个节点if (root.left == null && root.right == null){root = null;return;}//找到targetNode的父节点Node parent = searchParent(value);//如果要删除的节点是叶子节点if (targetNode.left == null && targetNode.right == null) {//判断targetNode是父节点的左子节点还是右子节点if (parent.left != null && parent.left.value == value) {//是左子节点parent.left = null;} else if (parent.right != null && parent.right.value == value) {//是右子节点parent.right = null;}}else if(targetNode.left != null && targetNode.right != null){//删除有两个子树的节点int minVal = delRightTreeMin(targetNode.right);targetNode.value = minVal;}else {//删除只有一个子树的节点//如果要删除的节点有左子节点if (targetNode.left != null){//如果targetNode是parent的左子节点if (parent.left.value == value){parent.left = targetNode.left;}else {//targetNode是parent的右子节点parent.right = targetNode.left;}}else {//如果要删除的节点有右子节点//如果targetNode是parent的左子节点if (parent.left.value == value){parent.left = targetNode.right;}else {//targetNode是parent的右子节点parent.right = targetNode.right;}}}}}//添加节点的方法public void add(Node node){if (root == null){root = node;}else {root.add(node);}}//中序遍历public void infixOrder(){if (root != null){root.infixOrder();}else {System.out.println("二叉排序树为空,不能遍历");}}
}//创建Node节点
class Node{int value;Node left;Node right;public Node(int value) {this.value = value;}@Overridepublic String toString() {return "Node{" +"value=" + value +'}';}/***  查找要删除的节点* @param value 希望删除的节点的值* @return 如果找到返回该节点,否则返回null*/public Node search(int value){if (value == this.value){//找到就是该节点return this;}else if (value < this.value){//如果要查找的值小于当前节点,向左子树递归查找if (this.left == null){return null;}return this.left.search(value);}else{//如果要查找的值大于当前节点,向右子树递归查找if (this.right == null){return null;}return this.right.search(value);}}/*** 查找要删除的节点的父节点* @param value 要找到的节点的值* @return 返回的是要删除的节点的父节点,如果没有就返回null*/public Node searchParent(int value){//如果当前节点就是要删除的节点的父节点if((this.left != null && this.left.value == value) ||(this.right != null && this.right.value == value)){return this;}else {//如果查找的值小于当前节点的值,并且当前的节点的左子节点不为空if (value < this.value && this.left != null){return this.left.searchParent(value);//向左子树递归查找}else if (value >=this.value && this.right != null){return this.right.searchParent(value);//向右子树递归查找}else {return null;//没有找到父节点}}}//添加节点//递归的形式添加,注意要满足二叉排序树的要求public void add(Node node){if (node == null){return;}//判断传入的节点值,跟当前子树根节点的值的关系if (node.value < this.value){//如果当前节点的左子树节点为nullif (this.left == null){this.left = node;}else {//递归想左子树添加this.left.add(node);}}else {//添加的节点值大于当前的节点值if (this.right == null){this.right = node;}else {//递归向右子树添加this.right.add(node);}}}//中序遍历public void infixOrder(){if (this.left != null){this.left.infixOrder();}System.out.println(this);if (this.right != null){this.right.infixOrder();}}
}

数据结构:二叉排序树相关推荐

  1. 数据结构题及c语言版实验报告排序,数据结构二叉排序树实验报告

    <数据结构二叉排序树实验报告>由会员分享,可在线阅读,更多相关<数据结构二叉排序树实验报告(7页珍藏版)>请在装配图网上搜索. 1.实验报告课程名:数据结构(C语言版)实验名: ...

  2. 数据结构---二叉排序树

    数据结构-二叉排序树 原理:参考趣学数据结构 代码: #include<stdio.h> #include<stdlib.h> typedef struct bstTree { ...

  3. 数据结构二叉排序树建立_数据结构101什么是二叉搜索树

    数据结构二叉排序树建立 In everyday life, we need to find things or make decisions, and one way to make that pro ...

  4. 索引介绍、索引原理、索引的数据结构(二叉排序树、平衡二叉树、B树、B+树)

    引入 本篇博客偏理论, 将会介绍一下知识: 索引介绍 索引原理 索引的数据结构(二叉树->平衡二叉树->B树->B+树) 聚集索引与辅助索引 MySQL索引管理 创建和删除索引的语法 ...

  5. 数据结构 - 二叉排序树

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 二叉排序 ...

  6. 数据结构-二叉排序树

    二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值: (2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值: ...

  7. 数据结构 - 二叉排序树BST(创建、遍历、删除节点)

    数组与链表区别: 二叉排序树的创建和遍历 代码实现 package tree.binarysorttree;public class BinarySortTreeDemo {public static ...

  8. 浅谈数据结构-二叉排序树

    构造二叉排序树目的是为了提高查找.插入和删除的效率.其实在构建二叉排序树的时候已经暗藏着排序.因此二叉排序树具有以下几个特点: 如根节点有左子树,则左子树的所有结点都比根节点小. 如根节点有右子树,则 ...

  9. 数据结构——二叉排序树

    二叉排序树的定义如下: 二叉排序树定义 --摘自百度百科 简单的来讲,就是对一个一个结点来讲,左子树比他小,右子树比他大.这样的树就是一颗二叉排序树. 例如:下面的数组组成的二叉排序树是什么? 28, ...

  10. 数据结构二叉排序树的查找

    1.二叉排序树的查找 (1)非递归方式(最坏空间复杂度O(1)) typedef struct BSTNode{int key;struct BSTNode *lchild, *rchild; }BS ...

最新文章

  1. CSDN湘苗培优|成长,从走出舒适区开始
  2. Serializer序列化使用
  3. Eclipse 报 “Exception in thread main java.lang.OutOfMemoryError: Java heap space ”错误的解决办法
  4. java list适配器_详解listview的四种适配器模式
  5. This subject is anonymous - it does not have any identifying principals and authorization operations
  6. opencv 人脸识别_python基于openCV人脸识别18行代码实现
  7. virtual 关键字以及虚函数的介绍
  8. Codeforces123E. Maze【树形dp】【概率dp】【证明题】
  9. 开源图像标注工具labelme的安装使用及汉化
  10. 数据结构(C语言版)严蔚敏课后答案
  11. Java开发常见英文单词(带音标翻译)
  12. 【高等数学】微分与全微分的几何意义的不同
  13. C# LINQ 语法备忘-刘欣
  14. 项目一:CRM(客户关系管理系统)--9---自定制action
  15. onsubmit和submit()详解
  16. 工作1-2年,月薪3000不可怕,可怕的是能力与之相匹配
  17. 听说C语言很难?怎么不来看看我这篇(二)变量
  18. linux系统中同一台服务器部署两个tomcat
  19. 变压器下为什么放鹅卵石?鹅卵石下面又是啥?为什么要有水?
  20. 2022-2028全球与中国一站式婚礼市场现状及未来发展趋势

热门文章

  1. OCI runtime exec failed: exec failed:解决方法
  2. 微信第三方平台-授权流程经验分享
  3. OSPF的高级应用之地址汇总与虚链路的配置
  4. iScroll4下表单元素聚焦及键盘的异常问题
  5. html5 canvas画布上合成
  6. 面试精讲之面试考点及大厂真题 - 分布式专栏 07 说一说什么是正向代理,反向代理
  7. 人工智能 - paddlepaddle飞桨 - 深度学习基础教程 - 语义角色标注
  8. Oracle数据恢复、数据库恢复、灾难恢复专题
  9. Windows上面挂载NFS共享
  10. Spring常用注解 - 使用注解来构造IoC容器