介绍:

二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。是数据结构中的一类。在一般情况下,查询效率比链表结构要高。对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。

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

例如: (7, 3, 10, 12, 5, 1, 9) ,对应的二叉排序树为:

package com.xawl.tree.BinarySortTree;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, 2, 3, 5, 7, 9, 10, 12binarySortTree.delNode(3);System.out.println("删除结点后");binarySortTree.infixOrder();}}//创建二叉排序树
class BinarySortTree {private Node root;public Node getRoot() {return root;}//添加结点的方法public void add(Node node) {if(root == null) {root = node;//如果root为空则直接让root指向node} else {root.add(node);}}//中序遍历public void infixOrder() {if(root != null) {root.infixOrder();} else {System.out.println("二叉排序树为空,不能遍历");}}//查找要删除的结点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);}}/*** 删除结点* @Description * @param value*/public void delNode(int value) {if(root == null) return;//需求先去找到要删除的结点  targetNodeNode targetNode = search(value);if(targetNode == null) return ;//如果当前这颗二叉排序树只有一个结点(因为targetNode不为null),所有root就是目标节点if(root.left == null && root.right == null){root = null;return;}//找到targetNode的父结点(能跑到这里说明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;}return;}//②删除的节点有两颗子树if(targetNode.left != null && targetNode.right != null){int minVal = delRightTreeMin(targetNode.right);targetNode.value = minVal;return;}//③删除的节点有一颗子树if((targetNode.left == null && targetNode.right != null) ||(targetNode.left != null && targetNode.right == null)){//如果要删除的结点有左子结点 if(targetNode.left != null){if(parent != null){//如果 targetNode 是 parent 的左子结点if(parent.left.value == value){parent.left = targetNode.left;}else{parent.right = targetNode.left;}}else root = targetNode.left;}//如果要删除的结点有右子结点 if(targetNode.right != null){if(parent != null){//如果 targetNode 是 parent 的左子结点if(parent.left.value == value){parent.left = targetNode.right;}else{parent.right = targetNode.right;}}else root = targetNode.right;}   }   }/*** 删除node 为根结点的二叉排序树的最小结点* @Description * @param node* @return 以node 为根结点的二叉排序树的最小结点的值*/public int delRightTreeMin(Node node) {Node target = node;//循环的查找左子节点,就会找到最小值while(target.left != null){target = target.left;}//此时遍历到的节点时叶子节点delNode(target.value);return target.value;     }
}//创建Node结点
class Node {int value;Node left;Node right;public Node(int value) {         this.value = value;}//添加节点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);}}}/*** 查找要删除的节点* @Description * @param value* @return*/public Node search(int value) {if(value == this.value){//当前节点就是目标节点return this;} else if(value < this.value ){//查找的值小于当前结点,向左子树递归查找//如果左子节点为空就返回nullif(this.left == null) return null;return this.left.search(value);} else {//如果查找的值不小于当前结点,向右子树递归查找//如果右子节点为空就返回nullif(this.right == null) return null;return this.right.search(value);}}/*** 查找要删除结点的父结点* @Description * @param value* @return*/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; //找不到父节点}}}@Overridepublic String toString() {return "Node [value=" + value + "]";}//中序遍历public void infixOrder() {if(this.left != null) {this.left.infixOrder();}System.out.println(this);if(this.right != null) {this.right.infixOrder();}}
}

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

  1. Java数据结构——排序二叉树

    排序二叉树概念 二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树.是数据结构中的一类. 对于二叉排序树的任何一个非叶子节点, 要求 ...

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

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

  3. Java数据结构学习——排序二叉树

    目录 前言 正文 排序二叉树的特点 插入节点 删除树节点 删除的节点是叶子节点 删除的节点存在左或者右子节点 删除的节点存在左右两子节点 遍历节点 先序遍历 中序遍历 后续遍历 全部代码展示 总结 前 ...

  4. 【数据结构Note5】- 树和二叉树(知识点超细大全-涵盖常见算法 排序二叉树 线索二叉树 平衡二叉树 哈夫曼树)

    文章目录 5.1 树和二叉树引入 5.1.1 树的概念 5.1.2 树的表示 5.1.3 树中基本术语 5.2 二叉树 5.2.1 概念 5.2.2 二叉树的性质 5.2.3 特殊的二叉树 5.2.4 ...

  5. 数据结构_排序二叉树(C语言)

    数据结构总目录 排序二叉树 1. 结构解析 排序二叉树的结构规则很简单,只遵循一个基本规则: 那就是在二叉树中,选择任意根结点,其左子树都比根节点小,右子树都比根节点大. 排序二叉树结构图 观察如下二 ...

  6. (数据结构)排序二叉树

    (数据结构)排序二叉树 建立并中序遍历一个排序二叉树 排序二叉树是指左子树的所有节点的值均小于它根节点的值,右子树的所有节点的值均大于它根节点的值,如下图是一棵排序二叉树 输入: 输入有一行,表示若干 ...

  7. 【数据结构】——排序二叉树

    排序二叉树即在构建二叉树的时候就对二叉树进行排序了,当中序遍历二叉树的时候即可得到一个有序的数列: 排序二叉树的规则就是: 若他的左子树不空,则左子树上所有结点的值均小于它的根结构的值: 若他的右子树 ...

  8. 数据结构之——排序二叉树、平衡二叉树和线索二叉树

    1.排序二叉树 排序二叉树(BST)也称二叉查找树,排序二叉树或者是一棵空树,或者是一棵具有下列特性的非空二叉树: (1)若左子树非空,则左子树上所有结点关键字值小于根节点的关键字值. (2)若右子树 ...

  9. python处理mysql数据结构_python环境下使用mysql数据及数据结构和二叉树算法(图)...

    python环境下使用mysql数据及数据结构和二叉树算法(图): 1 python环境下使用mysql 2使用的是 pymysql库 3 开始-->创建connection-->获取cu ...

最新文章

  1. 与跨国巨头合作,做羊还是做狼? --- 我看SAP取消HAND合作伙伴资格
  2. NIO详解(五):Buffer详解
  3. Android Kotlin协程和Retrofit结合使用
  4. 天气模式_北方降雪骤减!南方开启湿冷模式多阴雨!|天气展望
  5. 【数据库系统】DBMS、DBS、DBA、DB的区别
  6. 使用批处理脚本(BAT)调用FFMPEG批量编码视频
  7. IEEE ACCESS
  8. VRay无限平面的应用教程
  9. 用手持式频谱分析仪进行干扰检测
  10. 怎样用计算机做周计划表,在电脑桌面上制定每日工作日程计划表适合用哪一便签软件?...
  11. 复旦计算机考研规划,2021年复旦大学软件工程专业考研经验全指导
  12. 「详解」torch.nn.Fold和torch.nn.Unfold操作
  13. 干货:中国移动互联网行业深度报告
  14. python三维曲面合并_绘制多面体的三维曲面
  15. django celer_Celer招募Zing作为下一代基于Java的交易平台
  16. 没有基础适合学习java吗?
  17. 如何为公司创造价值?
  18. linux 之 mtd and mtdblock
  19. Oracle的emp表的基本函数学习
  20. 大道争锋手游如何在电脑上玩 大道争锋手游拟器教程

热门文章

  1. Android Studio报错:E/EGL_emulation: tid 3197: eglSurfaceAttrib(1199): error 0x3009 (EGL_BAD_MATCH)
  2. 【卡顿检测】深入理解
  3. 村子里有50个人,每人有一条狗,在这50条狗中有病狗(这种病不传染),于是人们要找出病狗。
  4. cesium底图切换
  5. 快速提高网站排名工具大全
  6. 树莓派不插HDMI不能开机的解决方法
  7. React Native热更新方案
  8. 位运算(异或、左移、右移)的运算规则
  9. 如何借用淘宝巧获海量精准流量?
  10. 激光雷达SLAM激光的前端配准算法