文章目录
- 介绍
- 实现
-
- 先定义一个节点
- 树
- 测试
- 总结
介绍
二叉排序树(Binary Search Tree,简称BST)是一种特殊的二叉树,其中每个节点的值都大于其左子树的任意节点值,而小于其右子树的任意节点值。
它具有以下特点:
- 左子树的值小于根节点的值,右子树的值大于根节点的值;
- 左子树和右子树也是二叉排序树;
- 二叉排序树的中序遍历结果是一个有序序列。
二叉排序树的应用非常广泛,以下是一些示例:
-
查找操作:由于二叉排序树的特性,可以通过比较节点的值快速进行查找操作。平均时间复杂度为O(log n)。
-
插入操作:将一个新节点插入到二叉排序树的合适位置,保持树的有序性。平均时间复杂度为O(log n)。
-
删除操作:删除二叉排序树中的某个节点,需要保持树的有序性。平均时间复杂度为O(log n)。
-
排序操作:利用二叉排序树的中序遍历结果是有序的特点,可以对一组数据进行排序。
-
范围查询:通过在二叉排序树上进行中序遍历,可以方便地获取某个范围内的节点。
-
数据统计:二叉排序树可用于统计某个节点的左子树节点数或右子树节点数,也可以统计整个树的节点数。
实现
先定义一个节点
/** * @description: 节点 * @author: Snow * @date: 2024/1/22 * ************************************************** * 修改记录(时间--修改人--修改说明): */ public class Node { int value; Node left; Node right; public Node(int value) { this.value = value; } /** 添加节点 */ public void add(Node root, Node node){ if( node.value <= root.value ){ if( root.left == null ){ root.left = node; return; }else{ add(root.left, node); } }else{ if( root.right == null ){ root.right = node; return; }else{ add(root.right, node); } } } /** 中序遍历 */ public void inOrder(Node root){ if( root.left != null ){ inOrder( root.left ); } System.out.print(root.value + " "); if( root.right != null ){ inOrder( root.right ); } } }
树
/** * @description: 二叉排序树 * 对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当 * 前节点的值小,右子节点的值比当前节点的值大。 * @author: Snow * @date: 2024/1/22 * ************************************************** * 修改记录(时间--修改人--修改说明): */ public class BinarySortTree { // 根节点 private Node root; /** 添加节点 */ public void add(Node node){ if( node == null ){ return; } if( root == null ){ root = node; return; } root.add(root, node); } /** 中序遍历 */ public void inOrder(){ if( root == null ){ return; } root.inOrder(root); } }
测试
public class BinarySortTreeTest { public static void main(String[] args) { int[] arr = {7, 3, 10, 12, 5, 1, 9}; BinarySortTree binarySortTree = new BinarySortTree(); for (int i : arr) { binarySortTree.add(new Node(i)); } binarySortTree.inOrder(); } }
总结
需要注意的是,二叉排序树对于具有相同值的节点处理会有一定问题,因为它要求每个节点的值都不相同。因此,在实际应用中,可以针对这个问题进行优化或改进,如在节点上增加一个计数器,来记录具有相同值的节点个数。