java实现普通二叉树增删改查(通过实现Comparable比较器接口实现二叉树的k值的泛型的比较)

//定义一棵二叉树
public class Tree<K ,V> {
    //二叉树的结点
    class TreeNode<K, V> implements Comparable<K> {       //让节点实现比较器接口
        K k; //结点的k值
        V v;//结点的v值
        TreeNode left;//结点的左节点(连接下一个结点)
        TreeNode right;//结点的右节点(连接下一个结点)

        public TreeNode(K k, V v, TreeNode left, TreeNode right) {
            this.k = k;
            this.v = v;
            this.left = left;
            this.right = right;
        }


        @Override
        public int compareTo(K k) {   //实现比较器的比较方法

            if (k instanceof Integer) {
                return ((Integer) k).compareTo(((Integer) this.k));
                //如果k是整型 就调用Integer类型写好的比较方法  如果传过来的k大于当前节点的k,就返回一个大于0的值。
            } else if (k instanceof String) {
                return ((String) k).compareTo((String) this.k);
                // 如果k是字符串类型 就调用String类型写好的比较方法
            }

            return 0; //其实return 0在这里不起作用 因为key一般都为整型和字符串类型 ,已经满足上面的条件了。一般Key不会存对象。
        }

        @Override
        public String toString() {
            return "TreeNode{" +
                    "k=" + k +
                    ", v=" + v +
                    ", left=" + left +
                    ", right=" + right +
                    '}';
        }

    }

    private TreeNode<K, V> root;  //根节点

    public Tree() {
        this.root = new TreeNode(null, null, null, null);  //初始化

    }

    public void add(K k, V v) {

        if (root.k == null) {
            root = new TreeNode<>(k, v, null, null);
        } else {
            root = addNode(k, v, root);       //根节点不为空,就去addNode()方法去添加相应,addNode()方法是为了递归而实现的
        }

    }

    public TreeNode addNode(K k, V v, TreeNode node) {
        int index = node.compareTo(k);
        if (index < 0) {
            if (node.left == null) {
                node.left = new TreeNode(k, v, null, null);
            } else {
                node.left = addNode(k, v, node.left);
            }
        }
        if (index > 0) {
            if (node.right == null) {
                node.right = new TreeNode(k, v, null, null);
            } else {
                node.right = addNode(k, v, node.right);
            }
        }
        //如果index==0 根据实际业务 看是替换value值还是其他的值
        return node;
    }

    public void outFirst() {    //先序遍历
        if (root.k == null)
            System.out.println("为空树,无法进行先序遍历");
        else {
            outFirst(root);
            System.out.println();
        }
    }

    public void outFirst(TreeNode node) {
        if (node == null)
            return;
        System.out.print(node.v + "  ");
        outFirst(node.left);
        outFirst(node.right);
    }

    public void outCenter() {    //中序遍历
        if (root.k == null)
            System.out.println("为空树,无法进行中序遍历");
        else {
            outCenter(root);

            System.out.println();
        }
    }

    public void outCenter(TreeNode node) {
        if (node == null)
            return;

        outCenter(node.left);
        System.out.print(node.v + "  ");
        outCenter(node.right);
    }

    public void outLast() {    //后序遍历
        if (root.k == null)
            System.out.print("为空树,无法进行后序遍历");
        else {
            outLast(root);
            System.out.println();
        }
    }

    public void outLast(TreeNode node) {  //后续遍历
        if (node == null)
            return;
        outLast(node.left);

        outLast(node.right);
        System.out.print(node.v + "  ");
    }

    public V getValue(K k) {
        V v = null;
        if (root.k == null) {
            System.out.println("二叉树为空,没有相应的Value值");
        } else {
            v = findValue(k, root, v);  //看能否找到 找到返回v 找不到返回Null
        }
        return v;
    }

    public V findValue(K k, TreeNode<K, V> node, V v) {
        if (node == null) {
            System.out.println("二叉树中不存在该k");
            return null;
        }
        int index = node.compareTo(k);

        if (index > 0) {
            v = (V) findValue(k, node.right, v);
        } else if (index < 0) {
            v = (V) findValue(k, node.left, v);
        } else {
            return node.v;
        }
        return v;
    }

    public  boolean delete(K k){
        boolean bool=false;
        if(root.k==null){
            System.out.println("二叉树为空,无法删除节点");
            return  false;
        }else {
            TreeNode curr = root;
         bool=   find(k,root,curr);
        }
        return  bool;
    }
    public  boolean find(K k,TreeNode node,TreeNode curr){
          boolean bool=false;
          if(node==null){
              System.out.println("无法找到此k值");
              return  false;
          }
         int index = node.compareTo(k);
        if (index > 0) {
            curr=node;
         bool= find(k,node.right,curr);
        } else if (index < 0) {
            curr=node;
         bool=   find(k,node.left,curr);
        } else {
          bool=  deleteNode(k,node,curr);
        }
           return  bool;
    }

    private boolean deleteNode(K k, TreeNode node, TreeNode curr) {
        String from="";
        if (Objects.equals(curr.left,node) ){
            from = "左";
        } else if(Objects.equals(curr.right,node)) {
            from = "右";
        }else if (Objects.equals(node,curr)){   //根节点
            from = "根";
        }
        if (node.left == null && node.right == null) { //叶子节点
            if (from.equals("左")) {
                curr.left = null;
            }
            else if(from.equals("右")){
                curr.right=null;
            }else{   //根
                System.out.println("删除节点为根节点,且没有后继结点。删除成功,此时二叉树为空。");
                root=new TreeNode<>(null,null,null,null);
                return true;
            }
        }else if(node.left!=null&&node.right==null){
              if(from.equals("左")){
                  curr.left=node.left;
              }
              else if(from.equals("右")){
                  curr.right=node.left;
              }else{
                  root=node.left;
              }
        }else if(node.left==null&&node.right!=null){  //被删除节点的左节点为空 有节点不为空 直接删 接右节点的
            if(from.equals("左")){
                curr.left=node.right;
            }
            else if(from.equals("右")){
                curr.right=node.right;
            }else {
                root=node.right;
            }
        }else{   //当被删除节点的左节点、右节点均有值时,拿右节点的最小值来替换
              TreeNode t;
            if(node.right.left==null){
                t=node.right;
                node.right=null;
            }else {
                 t = findMin(node.right.left, node.right);
            }
             node.k=t.k;
             node.v=t.v;
        }
          return  true;
    }

    private TreeNode findMin(TreeNode node,TreeNode curr) {
        TreeNode t=null;
        if (node.left==null)
        {
            t=node;
         curr.left=null;
//            node=null;
            return  t;
        }
        else {
            curr=node;
          t=  findMin(node.left,curr);

        }
        return  curr;

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值