搜索二叉樹的手寫


/**
 * 文件描述:手寫二叉搜索樹(左小右大的)
 * 作者: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;
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章