美文网首页
二分查找

二分查找

作者: mrjunwang | 来源:发表于2019-01-23 17:04 被阅读0次
    
    package datastruct;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    
    public class BinarySearchTree<T extends Comparable<T>> {
        TreeNode<T> root;
        private T value;
        private T postValue;
        int count = 0;
        int postCnt = 0;
        private int temp = Integer.MIN_VALUE;
        TreeNode<T> pre;
        private T preValue;
        private int preCnt;
    
        public BinarySearchTree(T[] arr) {
            root = createBinarySearchTree(arr, 0, arr.length - 1);
        }
    
        /**
         * 
         * @param arr
         * @param left
         * @param right
         * @return <p>
         *         Description:从有序的数组中构造一颗二叉搜索树
         *         </p>
         */
        public TreeNode<T> createBinarySearchTree(T[] arr, int left, int right) {
            if (left > right) {
                return null;
            }
    
            int mid = left + (right - left) / 2;
    
            // int mid=(left+right)/2;
            TreeNode<T> root = new TreeNode(arr[mid]);
    
            root.left = createBinarySearchTree(arr, left, mid - 1);
            root.right = createBinarySearchTree(arr, mid + 1, right);
            return root;
    
        }
    
        public <T extends Comparable<T>> TreeNode<T> getFather(TreeNode<T> root,
                TreeNode<T> p, TreeNode<T> q) {
            if (root == null || p.equals(root) || q.equals(root)) {
                return root;
            }
    
            if (root.value.compareTo(p.value) > 0
                    && root.value.compareTo(q.value) > 0) {
                TreeNode<T> left = getFather(root.left, p, q);
                return left;
            }
            if (root.value.compareTo(p.value) < 0
                    && root.value.compareTo(q.value) < 0) {
                TreeNode<T> right = getFather(root.right, p, q);
                return right;
            }
    
            return root;
    
        }
    
        /*
         * 寻找二叉查找树的第 k 个元素
         */
        public T getK(TreeNode<T> root, int k) {
    
            // /boolean flag=false;
            Holder holder = new Holder();
            inOrderTraversal(root, k, holder);
            return value;
        }
    
        public void inOrderTraversal(TreeNode<T> root, int k, Holder holder) {
    
            if (holder.flag == true) {
                return;
            }
            if (root == null) {
                return;
            }
            inOrderTraversal(root.left, k, holder);
    
            count++;
            if (count == k) {
                value = root.value;
                holder.flag = true;
                // return;
            }
            System.out.println(count + "." + root.value + holder.flag);
    
            inOrderTraversal(root.right, k, holder);
    
        }
    
        /**
         * 
         * @param root
         * @param p
         * @return <p>
         *         Description: 查找指定元素的后继
         *         </p>
         */
        public T getPostElement(TreeNode root, TreeNode p) {
            Holder holder = new Holder();
            inOrderTraversal(root, p, holder);
            return postValue;
        }
    
        public void inOrderTraversal(TreeNode<T> root, TreeNode node, Holder holder) {
            if (holder.flag == true) {
                return;
            }
            if (root == null) {
                return;
            }
            inOrderTraversal(root.left, node, holder);
    
            postCnt++;
    
            // System.out.println(postCnt+"."+root.value+holder.flag);
            if (root.value.equals(node.value)) {
    
                temp = postCnt;
            }
    
            if (postCnt == temp + 1) {
                postValue = root.value;
                holder.flag = true;
            }
    
            inOrderTraversal(root.right, node, holder);
    
        }
    
        public T getPreElement(TreeNode root, TreeNode p) {
            inOrderTraversalPre(root, p);
            return preValue;
        }
    
        public void inOrderTraversalPre(TreeNode<T> root, TreeNode node) {
            if (root == null) {
                return;
            }
            inOrderTraversalPre(root.left, node);
    
            preCnt++;
            if (preCnt == 1) {
                preValue = null;
                pre = root;
    
            }
    
            // System.out.println(preCnt+"."+root.value);
            else {
                if (!root.value.equals(node.value)) {
                    pre = root;
                }
    
                if (root.value.equals(node.value)) {
                    preValue = pre.value;
                }
            }
    
            inOrderTraversalPre(root.right, node);
    
        }
    
        public boolean findTarget(TreeNode<Integer> root, Integer target) {
            List<TreeNode> list = new ArrayList();
            inOrder(root, list);
            int left = 0;
            int right = list.size() - 1;
    
            while (left < right) {
                TreeNode<Integer> node1 = list.get(left);
                TreeNode<Integer> node2 = list.get(right);
                if (node1.value + node2.value == target) {
                    return true;
                } else if (node1.value + node2.value > target) {
                    right = right - 1;
                } else {
                    left = left + 1;
                }
            }
            return false;
    
        }
    
        public void inOrder(TreeNode<Integer> root, List list) {
            if (root == null) {
                return;
            }
    
            inOrder(root.left, list);
            list.add(root);
            inOrder(root.right, list);
    
        }
    
        public void printInorder(TreeNode root) {
            if (root == null) {
                return;
            }
            printInorder(root.left);
            System.out.println(root.value);
            printInorder(root.right);
        }
    
        /**
         * 
         * @param head
         * @return <p>
         *         Description:找有序链表的中间位置的前驱
         *         </p>
         */
        public MyNode getPreOfMid(MyNode head) {
            MyNode fast = head;
            MyNode slow = head;
            MyNode pre = head;
            while (fast != null && fast.getNext() != null) {
                pre = slow;
                slow = slow.getNext();
                fast = fast.getNext().getNext();
            }
            // System.out.println(slow.getData());
            return pre;
    
        }
    
        public TreeNode sortedListToBST(MyNode head) {
            if (head == null) {
                return null;
            }
            if (head.getNext() == null) {
                return new TreeNode(head.getData());
            }
            MyNode pre = getPreOfMid(head);
            MyNode mid = pre.getNext();
            pre.setNext(null);// 断开链表
            TreeNode root = new TreeNode(mid.getData());
            root.left = sortedListToBST(head);
            root.right = sortedListToBST(mid.getNext());
            return root;
        }
    
        public TreeNode<Integer> findMin(TreeNode<Integer> root) {
            if (root == null) {
                return null;
            }
            if (root.left == null) {
                return root;
            } else {
                return findMin(root.left);
            }
    
        }
    
        public TreeNode deleteMin(TreeNode root) {
            if (root == null) {
                return null;
            } else if (root.left == null) {
                TreeNode rightNode=root.right;
                root.right=null;
                return rightNode;
            } else {
                root.left = deleteMin(root.left);
                return root;
    
            }
        }
    
        public TreeNode delete(TreeNode<Integer> root, Integer vaInteger) {
            if (root == null) {
                return null;
            }
            if (root.value.compareTo(vaInteger)>0) {
                // System.out.println("less than"+root.value);
                root.left = delete(root.left, vaInteger);
                return root;
            } else if (root.value.compareTo(vaInteger)<0) {
                // System.out.println("greater than"+root.value);
    
                root.right = delete(root.right, vaInteger);
                return root;
            } else {
                if (root.left == null) {
                    // System.out.println("left is null");
                    TreeNode rightNode=root.right;
                    root.right=null;
                    return rightNode;
                } else if (root.right == null) {
                    // System.out.println("right child is null,left child is"+root.left.value);
                    TreeNode leftNode=root.left;
                    root.left=null;
                    return leftNode;
                } else {
                     System.out.println("both not null"+root.value+","+root.left.value+","+root.right.value);
    
                    //TreeNode t = root;
                    TreeNode newroot = findMin(root.right);
                    
                    newroot.left = root.left;
                    newroot.right = deleteMin(root.right);
                    System.out.println(root.value+","+root.left+","+root.right);
                    root.left=null;
                    root.right=null;
                    return newroot;
    
                }
            }
    
            
        }
    
        public static void main(String args[]) {
            // Integer[] arr={0,2,3,4,5,6,7,8,9,10};
            Integer[] arr = { 1, 2, 3, 4, 5, 6 };
    
            Arrays.sort(arr);
            BinarySearchTree<Integer> tree = new BinarySearchTree(arr);
            //tree.printInorder(tree.root);
    
            // System.out.println(tree.root.value);
            // TreeNode<Integer> node1=new TreeNode(new Integer(0));
            // TreeNode<Integer> node2=new TreeNode(new Integer(4));
            // TreeNode<Integer> node3=new TreeNode(new Integer(2));
    
            //
            // TreeNode node=tree.getFather(tree.root,node1,node2);
            // System.out.println(node.value);
            // System.out.println("--------------");
            // List<TreeNode> list=new ArrayList<TreeNode>();
            // tree.inOrder(tree.root,list);
            // for(TreeNode node4:list){
            // System.out.println(node4.value);
            // }
            // System.out.println("--------------");
    
            // boolean flag=tree.findTarget(tree.root, 21);
            // System.out.println(flag);
    
            // int e=tree.getK(tree.root, 2);
            // System.out.println(e);
            System.out.println("--------------");
    
            // System.out.println("post");
            // System.out.println(tree.getPostElement(tree.root, node2));
            // System.out.println("pre");
            //
            // System.out.println(tree.getPreElement(tree.root, node2));
            // System.out.println(tree.getPreElement(tree.root, node3));
    
            MyNode head = new MyNode();
            head.setData(-10);
            MyNode node1 = new MyNode();
            node1.setData(-3);
    
            MyNode node2 = new MyNode();
            node2.setData(0);
    
            MyNode node3 = new MyNode();
    
            node3.setData(5);
            MyNode node4 = new MyNode();
            node4.setData(9);
            head.setNext(node1);
            node1.setNext(node2);
            node2.setNext(node3);
            node3.setNext(node4);
            TreeNode root = tree.sortedListToBST(head);
            //// System.out.println(root.value);
            //List<TreeNode> list = new ArrayList();
            // tree.inOrder(root, list);
            //
            // for(TreeNode node:list){
            // System.out.print(node.value+",");
            // }
        //  System.out.println(tree.deleteMin(tree.root.right.right).value);
             TreeNode newRoot=tree.delete(root,0);
             tree.printInorder(newRoot);
            // System.out.println(newRoot.getValue());
            // List<TreeNode> newList=new ArrayList();
            // tree.inOrder(newRoot, newList);
            // for(TreeNode node:newList){
            // System.out.print(node.value+",");
            // }
        }
    
    }
    
    

    https://blog.csdn.net/itermeng/article/details/77763237

    相关文章

      网友评论

          本文标题:二分查找

          本文链接:https://www.haomeiwen.com/subject/eklsjqtx.html