데이터 구조의 2 분 검색 트 리 추가 삭제 및 옮 겨 다 니 기

1. 개념
빈 나무 나 다음 과 같은 성질 을 가 진 이 진 나 무 를 말한다.
1.            ,                     ;
2.            ,                     ;
3.       、            ;
4.          。

2. 이분 검색 트 리 노드 구축

    public class TreeNode<E extends Comparable<E>>{

        E e;
        TreeNode left;
        TreeNode right;
        public TreeNode(E e){
            this.e = e;
        }
    }

3. 2 분 검색 트 리 삽입 노드
2 분 검색 트 리 b 에 노드 node 알고리즘 을 삽입 합 니 다. 과정 은:
1.  b   ,  node           
2.      e    node.e,    
3.      e    node.e,  node           
4.      e    node.e,  node           

    public void add(E e){
        root = add(root,e);
    }

    private TreeNode add(TreeNode node,E e){
        if(node == null){
            return new TreeNode<>(e);
        }

        if(e.compareTo(node.e) < 0) {
            node.left = add(node.left, e);
        }else if(e.compareTo(node.e) > 0) {
            node.right = add(node.right, e);
        }
        return node;
    }

4. 2 분 검색 트 리 찾기 노드
이 진 트 리 b 에서 e 를 찾 는 과정 은:
1.  b   ,     ,  :
2.  e  b          ,     ;  :
3.  e  b          ,      ;  :
4.      。

    1.                  

    private boolean find(TreeNode node,E e){
        if(node == null)
            return false;
        if(e.compareTo(node.e) == 0) {
            return true;
        }else if(e.compareTo(node.e) < 0) {
            return find(node.left, e);
        }else{ // (e.compareTo(node.e) > 0)
            return find(node.right, e);
        }
    }


    2.              

    //      
    public E findMin(){
        TreeNode node = findMin(root);
        return node.e;
    }

    public TreeNode findMin(TreeNode node){
        if(node == null)
            return null;
        //            
        //          ,             
        if(node.left == null)
            return node;
        //         
        return findMin(node.left);
    }

    3.              

    //      
    public E findMax(){
        TreeNode node = findMax(root);
        return node.e;
    }

    public TreeNode findMax(TreeNode node){
        if(node == null)
            return null;
        if(node.right == null)
            return node;
        return findMax(node.right);
    }

5. 이분 검색 트 리 삭제 노드
노드 삭제 3 가지 상황

    1.              

    /**
     *    node               
     *                 
     * @param node
     * @return
     */
    private TreeNode removeMin(TreeNode node){

        if(node == null)
            return null;
        //          ,          null,              
        if(node.left == null) {
            //                    
            TreeNode rightNode = node.right;
            //        null
            node.right = null;
            size--;
            return rightNode;
        }
        //                   left
        node.left = removeMin(node.left);
        return node;
    }

    2.                

    private E removeMinNR(TreeNode root) {
        if(root == null)
            return null;

        TreeNode current = root;
        //          
        TreeNode parent = current;
        //              
        while (current.left != null){
            parent = current;
            current = current.left;
        }
        //                         
        parent.left =  current.right;
        return current.e;
    }

    3.              

    /**
     *    node               
     *                 
     * @param node
     * @return
     */
    private TreeNode removeMax(TreeNode node){

        if(node == null)
            return null;

        if(node.right == null) {
            TreeNode leftNode = node.left;
            node.left = null;
            size--;
            return leftNode;
        }

        node.right = removeMax(node.right);
        return node;
    }

    4.               

     private E removeMaxNR(TreeNode root) {
        if(root == null)
            return null;
        TreeNode current = root;
        TreeNode parent = current;
        while (current.right != null){
            parent = current;
            current = current.right;
        }
        parent.right = current.left;
        return current.e;
    }

    5.              

    //         
    public void remove(E e){
        //                        
        root = remove(root,e);
    }

    /**
     *         
     * @param node
     * @param e
     * @return
     */
    private TreeNode remove(TreeNode node,E e){

        if(node == null)
            return null;

        if(e.compareTo(node.e) < 0){
            //              ,               
            node.left = remove(node.left,e);
            return node;
        }else if(e.compareTo(node.e) > 0){
            //              ,               
            node.right = remove(node.right, e);
            return node;
        }else{
            //         
            //                     
            if(node.left == null){
                TreeNode rightNode = node.right;
                node.right = null;
                size--;
                return rightNode;
            }else if(node.right == null){
            //                     
                TreeNode leftNode = node.left;
                node.left = null;
                size--;
                return leftNode;
            }else {
                //              

                //1.                  
                TreeNode successor = findMin(node.right);
                //2.            ,                
                successor.right = removeMin(node.right);
                //3.                       
                successor.left = node.left;
                //4.                     
                node.left = node.right = null;
                //5.         
                return successor;
            }
        }
    }

    6.               

    /**
     *            
     * @param e
     */
    public void removeNR(E e){
        removeNR(root,e);
    }

    private void removeNR(TreeNode node,E e){
        if(node == null) return;
        TreeNode current = node;
        TreeNode parent = node;
        //      
        boolean isLeftChild = true;
        while (current.e != e){
            //      
            parent = current;
            if(e.compareTo(current.e) < 0){
                current = current.left;
                isLeftChild = true;
            }else {
                current = current.right;
                isLeftChild = false;
            }

            if(current == null) return;
        }

        //         
        if(current.left == null){
            if(current == this.root){
                //       root,               root
                //       root = root.right;
                this.root = current.right;
                current.right = null;
            }else if(isLeftChild){
                TreeNode rChild = current.right;
                current.right = null;
                parent.left = rChild;
                size--;
            }else{
                TreeNode rChild = current.right;
                current.right = null;
                parent.right = rChild;
                size--;
            }
        }else if(current.right == null){
            if(current == this.root){
                //       root,               root
                //       root = root.left;
                this.root = current.left;
                current.left = null;
            }else if(isLeftChild){
                TreeNode lChild = current.left;
                current.left = null;
                parent.left = lChild;
                size--;
            }else{
                TreeNode lChild = current.left;
                current.left = null;
                parent.right = lChild;
                size--;
            }
        }else{
            //         
            //                  
            TreeNode successor = findMin(current.right);
            //           ,                           
            successor.right = removeMin(current.right);
            //                      
            successor.left = current.left;
            //          
            current.left = current.right = null;

            if(current == this.root){
                //                        root
               this.root = successor;
            }else if(isLeftChild){
                //                     parent.left =     
                parent.left = successor;
            }else{
                //   parent.right =     
                parent.right = successor;
            }
        }
    }

6. 2 분 검색 소 트 리 앞 뒤 순서 옮 겨 다 니 기

    1.          ,    ,     

    //    
    public void preOrder(){
        System.out.println("    :");
        preOrder(root);
        System.out.println();
    }

    private void preOrder(TreeNode node){
        if(node == null)
            return;
        System.out.print(node.e+" ");
        preOrder(node.left);
        preOrder(node.right);
    }

    2.          ,    ,     

    //    
    public void inOrder(){
        System.out.println("    :");
        inOrder(root);
        System.out.println();
    }

    private void inOrder(TreeNode node){
        if(node == null)
            return;
        inOrder(node.left);
        System.out.print(node.e+" ");
        inOrder(node.right);
    }

    3.          ,    ,     

    //    
    public void postOrder(){
        System.out.println("    :");
        postOrder(root);
        System.out.println();
    }

    private void postOrder(TreeNode node){
        if(node == null)
            return;
        postOrder(node.left);
        postOrder(node.right);
        System.out.print(node.e+" ");
    }

7. 2 분 검색 소 트 리 비 재 귀적 순서 옮 겨 다 니 기

    //       ,        ,       ,
    //           ,     ,         ,    ,
    //             ,         ,         ,
    //         ,      
    private void preOrderNR(TreeNode<E> root){
        if(root == null) return;
        Stack stack = new Stack();
        //  
        stack.push(root);
        System.out.println("         :");
        while ( !stack.isEmpty()){
            //  
            TreeNode node = (TreeNode) stack.pop();
            if(node == null)    return;
            System.out.print(node.e+" ");
            if(node.right != null) {
                stack.push(node.right);
            }
            if(node.left != null) {
                stack.push(node.left);
            }
        }
    }

8. 2 분 검색 트 리 층 을 옮 겨 다 니 기

    //      ,         ,       ,             ,
    //          ,   ,       ,       
    private void levelOrder(TreeNode node){
        if(node == null)
            return;
        Queue queue = new LinkedList<>();
        //     
        queue.add(node);
        while (!queue.isEmpty()){
            //  
            TreeNode tailNode = (TreeNode) queue.remove();
            if(tailNode != null) {
                System.out.print(tailNode.e + " ");
                queue.add(tailNode.left);
                queue.add(tailNode.right);
            }
        }
    }

9. 소결 과 연락처
                       

QQ:1509815887

좋은 웹페이지 즐겨찾기