搜索二叉树的手写

本文介绍了如何手写一个二叉搜索树,包括前序、中序和后序遍历,查找、删除节点的方法,以及判断是否为平衡二叉搜索树的逻辑。通过实例展示了如何插入、查找和删除节点,以及保持树的平衡。
摘要由CSDN通过智能技术生成
/**
 * 文件描述:手写二叉搜索树(左小右大的)
 * 作者:chenjingkun708
 * 创建时间:2020/3/24
 * 更改时间:2020/3/24
 */
public class MyBinarySearchTree {
    public Node root;//树的根节点

    public MyBinarySearchTree() {
    }

    /*
          前序遍历,打印的顺序依次是:根,左,右节点
         */
    public void frontTravesal(Node root){
        if (root==null){
            return;
        }
        Log.i("android_test", String.valueOf(root.value));
        frontTravesal(root.left);
        frontTravesal(root.right);
    }

    /*
      中须遍历
     */
    public void centerTravesal(Node root){
        if (root==null){
            return;
        }
        centerTravesal(root.left);
        Log.i("android_test",String.valueOf(root.value));
        centerTravesal(root.right);
    }

    /*
      后序遍历
     */
    public void lastTravesal(Node root){
        if (root==null){
            return;
        }
        lastTravesal(root.left);
        lastTravesal(root.right);
        Log.i("android_test",String.valueOf(root.value));
    }

    //查找:利用特性:左小右大,递归
    public boolean find(int target){
        return find(root,target)==null?false:true;
    }

    private Node find(Node root,int target){
        if (root==null){
            return null;
        }
        if (root.value==target){
            return root;
        }
        if (target<root.value){
            return find(root.left,target);
        }else {
            return find(root.right,target);
        }
    }

    //删除,因为要涉及到移动,可采取一些办法来实现。可能会有点问题
    public boolean delete(int target){
         Node node = find(root,target);
         if (node==null){
             return false;
         }
         //1.向右查找最大的节点
         Node maxNode = popReplace(node);
         //2. 把目标值用最大值代替
         node.value = maxNode.value;
         //3.向下沉去纠正节点
         shritDownNode(node);
         return true;
    }

    //下沉去纠正节点
    private void shritDownNode(Node curNode) {
        if (curNode==null){
            return;
        }
        if (curNode.left!=null&&curNode.value<curNode.left.value){
            //交换节点
            Node leftNode = curNode.left;

            Node tempNode = leftNode;

            leftNode.value = curNode.value;
            leftNode.left = curNode.left;
            leftNode.right = curNode.right;

            curNode.value = tempNode.value;
            curNode.left = tempNode.left;
            curNode.right = tempNode.right;
            shritDownNode(curNode);
        }else if (curNode.right!=null&&curNode.value>curNode.right.value){
            //交换节点
            Node rightNode = curNode.right;

            Node tempNode = rightNode;

            rightNode.value = curNode.value;
            rightNode.left = curNode.left;
            rightNode.right = curNode.right;

            curNode.value = tempNode.value;
            curNode.left = tempNode.left;
            curNode.right = tempNode.right;
            shritDownNode(curNode);
        }
        return;
    }

    //弹出最右边的右节点或左节点
    private Node popReplace(Node root){
        if (root.right==null){
            return root;
        }
        Node maxNode = popReplace(root.right);

        if (maxNode.left!=null){
            Node leftNode = maxNode.left;
            maxNode.left = null;
            return leftNode;
        }else {
            root.right = null;
            return maxNode;
        }
    }

    //插入值
    public void add(int value){
        addNode(value,root);
    }
    //采用递归的方式
    private Node addNode(int value,Node curNode){
        if (curNode==null){
            return new Node(value,null,null);
        }
        if (value<curNode.value){
            curNode.left = addNode(value,curNode.left);
        }else if (value>curNode.value){
            curNode.right = addNode(value,curNode.right);
        }else{
            curNode.value = value;
        }
        return curNode;
    }


    //判断是不是自平衡的搜索二叉树:左右子树的高度不超过1,并且子树也是一个平衡二叉树
    public boolean isBalanceTree(Node node){
        if (node==null){
            return true;
        }
        int leftDep = getTreeDeep(node.left);
        int rightDep = getTreeDeep(node.right);
        return Math.abs(leftDep-rightDep)<=1&&isBalanceTree(node.left)&&isBalanceTree(node.right);
    }

    //获取树或子树的深度
    public int getTreeDeep(Node childRoot) {
        if (childRoot==null){
            return 0;
        }
        int leftDep,rightDep;
        leftDep = getTreeDeep(childRoot.left)+1;
        rightDep = getTreeDeep(childRoot.right)+1;
        return leftDep>rightDep?leftDep:rightDep;
    }


    /*
      树节点类表示
     */
    public static class Node{
        int value;
        //左孩子
        public Node left;
        //右孩子
        public Node right;

        public Node(int value, Node left, Node right) {
            this.value = value;
            this.left = left;
            this.right = right;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值