Java实现二叉树

代码如下

public class BinaryTree<Key extends Comparable<Key>, Value> {

    private class TreeNode {
        //存储键
        private Key key;
        //存储值
        private Value value;
        //记录左子结点
        private TreeNode left;
        //记录右子结点
        private TreeNode right;

        public TreeNode(Key key, Value value, TreeNode left, TreeNode right) {
            this.key = key;
            this.value = value;
            this.left = left;
            this.right = right;
        }
    }

    //创建根结点
    private TreeNode root;
    //记录树中元素数量
    private int sum;

    //获取树中的元素个数
    public int size() {
        return this.sum;
    }

    //判断树是否为空树
    public boolean isEmpty() {
        return root == null;
    }

    //向指定的树中添加key-value,并返回添加后的新的树
    private TreeNode put(TreeNode x, Key key, Value value) {
        //如果x子树为空
        if (x == null) {
            sum++;
            return new TreeNode(key, value, null, null);
        }
        //如果x子树不为空
        //比较x结点的键和key的大小
        int temp = key.compareTo(x.key);
        //如果x结点的键小于key,则继续寻找x结点的左子结点
        if (temp < 0)
            x.right = put(x.right, key, value);
            //如果x结点的键大于key,则继续寻找x结点的右子结点
        else if (temp > 0)
            x.left = put(x.left, key, value);
            //如果x结点的键等于key,则替换x结点中的value值
        else
            x.value = value;
        return x;
    }

    //通过键值对(key-vaule)向树中添加元素
    public void put(Key key, Value value) {
        root = put(root, key, value);
    }

    //查询树中指定键值key处对应的value值
    public Value get(Key key) {
        return get(root, key);
    }

    //从指定的树中查找key对应的值
    public Value get(TreeNode x, Key key) {
        //如果该树为空
        if (x == null)
            return null;
        //该树不为空
        //比较x结点的键和key的大小
        int temp = key.compareTo(x.key);
        //若x.key < key,则寻找x结点的右子树
        if (temp < 0)
            return get(x.right, key);
            //若x.key > key,则寻找x结点的左子树
        else if (temp > 0)
            return get(x.left, key);
            //若x.key = key,则返回当前x结点对应的value
        else
            return x.value;
    }

    //删除指定x树中key对应的value值,并返回被删除的value值
    public TreeNode delete(TreeNode x, Key key) {
        //若x树为空树
        if (x == null)
            return null;
        //若x树不为空树
        //比较x结点的键和key的大小
        int temp = key.compareTo(x.key);
        //若x.key < key,则寻找x结点的右子树
        if (temp < 0)
            x.right = delete(x.right, key);
            //若x.key > key,则寻找x结点的左子树
        else if (temp > 0)
            x.left = delete(x.left, key);
            //若x.key = key,则需完成删除x结点的动作
        else {
            sum--;
            //当x的左右子树分别为空的情况下
            if (x.right == null)
                return x.left;
            if (x.left == null)
                return x.right;
                //若x的左右子树均不为空需要找到x树对应右子树中的最小结点,即寻找到x的右子树的最左边的叶子结点
            else {
                sum--;
                //创建rLeaf为x的右子树的最左边的叶子结点
                TreeNode rLeaf = x.right;
                while (rLeaf.left != null)
                    rLeaf = rLeaf.left;
                //删除x的最左边的叶子结点
                TreeNode Temp = x.right;
                while (Temp.left != null) {
                    if (Temp.left.left == null)
                        Temp.left = null;
                    else
                        Temp = Temp.left;
                }
                //让rLeaf成为x的左、右子树的双亲
                rLeaf.left = x.left;
                rLeaf.right = x.right;
                //让x结点的父亲成为rLeaf的父亲
                x = rLeaf;
            }
        }
        return x;
    }

    //删除整个树中指定键值key处的value值
    public TreeNode delete(Key key){
        return delete(root,key);
    }


}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值