递归实现二叉树的API设计

这个博客详细介绍了二叉查找树(BST)的数据结构及其操作,包括插入、查找、删除、获取最小和最大键、向上取整、向下取整、选择和排名等方法。还展示了内部节点类MyNode的实现,每个节点包含键、值、左右子节点和节点计数器。
摘要由CSDN通过智能技术生成
/**
 * 二叉查找树
 */
public class MyTree<Key extends Comparable<Key>, Value> {
    //根节点
    private MyNode root;

    //获取该数的总结点数量
    public int size() {
        return size(root);
    }

    private int size(MyNode x) {
        if (x == null) return 0;
        else return x.N;
    }

    //获取key处的值
    public Value get(Key key) {
        return get(root, key);
    }

    private Value get(MyNode x, Key key) {
        if (x == null)
            return null;

        int tmp = key.compareTo(x.key);

        if (tmp < 0)
            return get(x.left, key);
        else if (tmp > 0)
            return get(x.right, key);
        else
            return x.value;
    }

    //在指定键key处插入值value,若没有该键则创建新结点
    public void put(Key key, Value value) {
        root = put(root, key, value);
    }

    private MyNode put(MyNode x, Key key, Value value) {
        if (x == null)
            return new MyNode(key, value, 1);
        int tmp = key.compareTo(x.key);

        if (tmp < 0)
            x.left = put(x.left, key, value);
        else if
        (tmp > 0) x.right = put(x.right, key, value);
        else
            x.value = value;
        x.N = size(x.left) + size(x.right) + 1;
        return x;
    }

    //寻找最小键minKey
    public Key min() {
        return min(root).key;
    }

    private MyNode min(MyNode x) {
        if (x.left == null) return x;
        return min(x.left);
    }

    //寻找最大键maxKey
    public Key max() {
        return max(root).key;
    }

    private MyNode max(MyNode x) {
        if (x.right == null) return x;
        return max(x.right);
    }

    //向上取整
    public Key floor(Key key) {
        MyNode x = floor(root, key);
        if (x == null) return null;
        return x.key;
    }

    private MyNode floor(MyNode x, Key key) {
        if (x == null)
            return null;
        int tmp = key.compareTo(x.key);
        if (tmp == 0)
            return x;
        if (tmp < 0)
            return floor(x.left, key);
        MyNode tNode = floor(x.right, key);
        if (tNode != null)
            return tNode;
        else
            return x;
    }

    //向下取整
    public Key ceiling(Key key) {
        MyNode x = ceiling(root, key);
        if (x == null) return null;
        return x.key;
    }

    private MyNode ceiling(MyNode x, Key key) {
        if (x == null)
            return null;
        int tmp = key.compareTo(x.key);
        if (tmp == 0)
            return x;
        if (tmp > 0)
            return floor(x.right, key);
        MyNode tNode = floor(x.left, key);
        if (tNode != null)
            return tNode;
        else
            return x;
    }

    //构造select方法返回排名为k的结点的键key
    public Key select(int k) {
        return select(root, k).key;
    }

    private MyNode select(MyNode x, int k) {
        if (x == null)
            return null;
        int tmp = size(x.left);
        if (tmp > k)
            return select(x.left, k);
        if (tmp < k)
            return select(x.right, k);
        else return x;
    }

    //构造rank方法返回以为x根结点的子树的键key的数量
    public int rank(Key key) {
        return rank(key, root);
    }

    private int rank(Key key, MyNode x) {
        if (x == null)
            return 0;
        int tmp = key.compareTo(x.key);
        if (tmp < 0)
            return rank(key, x.left);
        else if (tmp > 0)
            return 1 + size(x.left) + rank(key, x.right);
        else
            return size(x.left);
    }

    /*
    删除操作
    */
    //删除最小键minKey
    public void deleteMin() {
        root = deleMin(root);
    }

    private MyNode deleMin(MyNode x) {
        if (x.left == null)
            return x.right;
        x.left = deleMin(x.left);
        x.N = size(x.left) + size(x.right) + 1;
        return x;
    }

    //删除最大键maxKey
    public void deleteMax() {
        root = deleteMax(root);
    }

    private MyNode deleteMax(MyNode x) {
        if (x.right == null)
            return x.left;
        x.right = deleteMax(x.right);
        x.N = size(x.right) + size(x.left) + 1;
        return x;
    }

    //删除指定键key
    public void delete(Key key) {
        root = delete(root, key);
    }

    private MyNode delete(MyNode x, Key key) {
        if (x == null)
            return null;
        int tmp = key.compareTo(x.key);
        if (tmp < 0)
            x.left = delete(x.left, key);
        else if (tmp > 0)
            x.right = delete(x.right, key);
        else {
            if (x.left == null)
                return x.right;
            if (x.right == null)
                return x.left;
            MyNode tNode = x;
            x = min(tNode.left);
            x.right = deleMin(tNode.right);
            x.left = tNode.left;
        }
        x.N = size(x.left) + size(x.right) + 1;
        return x;
    }


    //嵌套定义一个私有类来表示二叉查找树的结点
    //每个结点都含有一个键、一个值、一条左链、一条右链和一个结点计数器
    private class MyNode {
        private Key key;//键
        private Value value;//值
        private MyNode left, right;//指向子树的链接
        private int N;//以该结点为根的子树中的结点总数

        public MyNode(Key key, Value value, int N) {
            this.key = key;
            this.value = value;
            this.N = N;
        }
    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值