二叉排序树(BST)
1. 简介
-
为什么使用二叉排序树
对于顺序存储的二叉树:不排序-查找/删除/插入困难
排序-删除/插入困难
链式存储的二叉树:是否排序-都会查找困难(每次都需要从头结点开始找)
而二叉排序树就解决了以上问题
-
什么是二叉排序树
百度百科定义:二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。在一般情况下,查询效率比链表结构要高。
要求: 对于二叉树中的任何一个非叶子结点,要求左子结点比当前结点值小,右子结点比当前结点值大。
举例:
需求-将如下数字 {7,3,11,13,5,1,9} 变成一颗二叉排序树
实现思路:将第一个数作为根节点,依次比较,比它大的放右子节点,小的放子节点
如果子节点还有子节点,那么就需要接着往下比较,直到找到一个合适的位置,如下图
如果我们想插入任意一个数字,比如插入10
比较过程:和7比较->和11比较->和9比较->插入到9的右子节点
2. 代码实现
2.1 涉及的操作
add() 增加结点-使其变成一颗二叉排序树
midShow() 中序遍历输出二叉排序树-使用中序遍历刚好能够输出排序好的序列
search() 查找节点-输入value,如果找到返回value
delete() 删除节点-只删除传入的目标节点,其他结点不删除并且删除后还是一颗二叉排序树
情况一: 删除的节点是叶子结点
只需切断父节点和删除节点的联系即可
情况二: 删除节点有一颗子树:左子树或右子树
需要用删除节点的子树替换掉目标结点, 如:删除节点是left,它的子树是left parent.left=target.left
情况三: 删除节点有两棵子树,左子树和右子树
删除节点的左子树中结点值都小于删除节点,右子树都大于删除节点
要删除目标节点,我们要找到可以替代它位置的节点,而这个结点就是左子树最大的或者右子树最小的
Way1:删除目标节点左子树中最大的结点并存储它的value,用value替换掉目标节点value
Way2:删除目标节点右子树中最小的结点并存储它的value,用value替换掉目标节点value
(以下我们采用方式二)
2.2 代码
BinarySortTree.java
//二叉排序树
public class BinarySortTree {
Node root;
//添加节点
public void add(Node node){
//第一次进入方法时,是一颗空树,设置为根节点root
if(root==null){
root=node;
}else{
//调用节点的add方法
root.add(node);
}
}
//中序遍历,输出二叉排序树结果
public void midShow(){
if(root!=null){
root.midShow(root);
}
}
//查找节点
public Node search(int value){
if(root!=null){
return root.search(value);
}
return null;
}
//删除结点
public void delete(int value){
if(root==null){
return;
}
root.delete(value);
}
//查找父节点
public Node SearchParent(int value){
if(root!=null){
return root.searchParent(value);
}
return null;
}
}
Node.java
public class Node {