介绍:

二叉排序树(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. arcgis server 开发
  2. CDN和智能DNS原理和应用 (原)
  3. Maven插件tomcat7-maver-plugin
  4. 临界区设计太大或太小有何缺点_这些衣帽间设计案例,装出豪宅范?闺蜜来了都看呆!...
  5. 求时间差的sql语句。 比如如下数据
  6. Maximum Xor Secondary CodeForces - 281D (单调栈)
  7. Paw —— 比Postman更舒服的API利器
  8. centos7 ifconfig命令找不到_Linux基础命令大全,你找不到的这都有
  9. 如何彻底搞懂面向 Web 开发者的正则表达式?
  10. 对于HTTP过程中POST内容加密的解决方案
  11. 自己定义控件-DownSlidingDrawer
  12. WebGL学习之法线贴图
  13. 阿里矢量图库的正确打开方式
  14. 【经典源码】网络安全--远程控制--Gh0st3.6饭客网络sid版
  15. Windows窗体之ShowWindow函数分析
  16. 如何划分安全域及网络如何改造
  17. 天然产物分子机制研究(内含彩蛋)——药物靶点预测系统案例分析2
  18. swiper 上滑触发_在绝地求生加入滑铲等战术动作会怎么样?你们想过吗?
  19. 美团移动端UI一致性解决方案探索
  20. JAVA中phrase居左_mymail iText中用文本块(chunk)、短语(Phrase)和段 联合开发网 - pudn.com...

热门文章

  1. spring boot 转pdf (html转pdf)
  2. lecture09 Convex 模型预测控制(MPC)
  3. Minio 分布式集群部署
  4. B. Nick and Array(数学+贪心)Codeforces Round #569 (Div. 2)
  5. 关于系统复杂性的一句箴言
  6. 视频 TS 内容详细讲解
  7. HTTP/HTTPS协议
  8. 電影嘗試三 webtorrent-desktop在線觀看電影magnet
  9. macOS 安装PhotoshopCC 2017
  10. 开源的大文件上传组件NeatUpload™