Java-数据结构二叉排序树

定义

二叉排序树(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);
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值