定义
二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。是数据结构中的一类。在一般情况下,查询效率比链表结构要高。
一棵空树,或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
【注】:以上的三种定义在不同的数据结构教材中均有不同的定义方式 但是都是正确的 在开发时需要根据不 同的需求进行选择
【注2】:没有键值相等的结点。
基本操作
二叉排序数的数据元素可采用键值对的形式存储,每个数据元素构成一个二叉排序树的结点。每个结点由键,值value,左子结点和右子结点等组成,具体描述如下:
public class BiNode <V>{
public int key;
public V value;
public BiNode<V>lChild;
public BiNode<V>rChild;
public BiNode(){
key=0;
value=null;
lChild=null;
rChild=null;
}
public BiNode(int k,V v){
key=k;
value=v;
lChild=null;
rChild=null;
}
}
插入算法
//插入算法
public boolean insert(int k,V v){
BiNode<V>p,pre;//p指当前结点,pre指p的父结点
boolean isSearched=false;//假定二叉树中不存在<k,v>的数据元素
p=root;
pre=root;//刚开始p,pre都指向根节点
while (p!=null&&k!=p.key){
pre=p;
if (k< p.key)
p=p.lChild;
else
p=p.rChild;
}
if (p!=null&&k==p.key){
isSearched=false;
return false;//要插入的数据已经存在,不需要插入
}else {
p=new BiNode(k,v);
if (k< pre.key)
pre.lChild=p;
else
pre.rChild=p;
return true;
}
}
删除算法
//删除算法
public void deleteNode(BiNode p) {
//如果结点有左子树
/*1.若p有左子树,找到其左子树的最右边的叶子结点r,用该叶子结点r来替代p,把r的左孩子
作为r的双亲的右孩子。
2.若p没有左子树,直接用p的右孩子取代它。
*/
if (p != null) {
if (p.lChild != null) {
BiNode r = p.lChild;
BiNode prev = p.lChild;
while (r.rChild != null) {
prev = r;
r = r.rChild;
}
//若r不是p的左子树,p的左子树不变,r的左子树作为r的双亲结点的右孩子结点
p.value = r.value;
if (prev != r) {
prev.rChild = r.lChild;
} else {
//若r是p的左子树,则p的左子树指向r的左子树
p.lChild = r.lChild;
}
} else {
p = p.rChild;
}
}
}
查找算法
public class BiTree <V>{
public BiNode<V>root;
public BiTree(int k,V v){
root=new BiNode<V>(k,v);
}
/*在root所指二叉排序树中查找某关键字等于key的数据元素,
* 若查找成功,则返回该数据结点,否则返回null*/
BiNode<V>search(BiNode<V>node,int key){
if (node==null||key==node.key)
return node;
else if (key< node.key)
return search(node.lChild,key);//继续查找左子树
else return search(node.rChild,key);
}
}