數據結構 玩轉數據結構 6-10 二分搜索樹的層序遍歷

0    課程地址

https://coding.imooc.com/lesson/207.html#mid=13471

 

1    重點關注

1.1    隊列實現層序遍歷 定義和應用場景

定義:由上到下,一層層遍歷,又稱爲廣度遍歷

應用場景:算法求解,在算法如走出迷宮的路徑等方法中,有最短路徑問題,通過這種方法能夠快速求解

 

1.2    隊列實現層序遍歷 實現

見3.1

 

2    課程內容

 

 

3    Coding

3.1    用隊列實現層序遍歷

  • 關鍵代碼
    /**
     * 二分搜索樹廣度遍歷
     * @author weidoudou
     * @date 2022/11/8 11:23
     * @return boolean
     **/
    public boolean levelOrder(){
        Queue<Node> queue = new LinkedList<>();
        queue.add(root);

        while (queue.peek()!=null){
            Node cur = queue.peek();
            System.out.println(cur.e);
            queue.remove();
            if(cur.left!=null){
                queue.add(cur.left);
            }
            if(cur.right!=null){
                queue.add(cur.right);
            }
        }
        return false;
    }

 

  • 全量代碼
package com.company;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

public class BST2<E extends Comparable> {

    //1     內部類
    private class Node{
        //二叉樹特有屬性
        private Node left,right;
        private E e;
        private Node(E e){
            this.e = e;
            this.left = null;
            this.right = null;
        }
    }

    private int size;
    private Node root;

    public BST2(){
        this.size = 0;
        this.root = null;
    }

    /**
     * 定義基本方法 getSize
     * @author weidoudou
     * @date 2022/11/3 12:57
     * @return int
     **/
    public int getSize(){
        return size;
    }

    /**
     *查詢是否爲空
     * @author weidoudou
     * @date 2022/11/3 12:58
     * @return boolean
     **/
    public boolean isEmpty(){
        return size == 0;
    }

    //2     循環添加元素,把null也看作節點
    public void add(E e){
        root = add(e,root);
    }

    //3     遞歸,添加元素
    public Node add(E e,Node root){
        //3.1   終止條件
        if(root==null){
            size++;
            return new Node(e);
        }

        //3.2   遞歸
        //3.2.1 遞歸左孩子
        if(e.compareTo(root.e)<0){
            root.left = add(e,root.left);
        }

        //3.2.2 遞歸右孩子
        if(e.compareTo(root.e)>0){
            root.right = add(e,root.right);
        }

        //點睛之筆
        return root;
    }

    /**
     * 二分搜索樹 是否包含元素e
     * @author weidoudou
     * @date 2022/11/4 9:55
     * @param e 請添加參數描述
     * @return boolean
     **/
    public boolean contains(E e){
        return contains(e,root);
    }

    /**
     * 二分搜索樹查詢 遞歸
     * @author weidoudou
     * @date 2022/11/4 9:57
     * @param e 請添加參數描述
     * @param  node 請添加參數描述
     * @return boolean
     **/
    private boolean contains(E e,Node node){
        //終止條件
        if(node == null){
            return false;
        }
        if(e.compareTo(node.e)==0){
            return true;
        }

        //遞歸條件
        if(e.compareTo(node.e)<0){
            return contains(e,node.left);
        }else{
            return contains(e,node.right);
        }

    }

    /**
     * 4     二分搜索樹,前序遍歷 顧名思義,先遍歷根節點,再遍歷左節點,最後遍歷右節點
     * @author weidoudou
     * @date 2022/11/5 14:54
     * @return null
     **/
    public boolean preOrder(){
        preOrder(root);
        return false;
    }

    //前序遍歷 遞歸
    private void preOrder(Node node){
        //終止條件
        if(node==null){
            return;
        }

        //遞歸
        System.out.println(node.e);//1
        preOrder(node.left);
        preOrder(node.right);
    }

    /**
     *  前序遍歷非遞歸寫法 用棧的方法實現 while 代替遞歸
     * @author weidoudou
     * @date 2022/11/8 9:57
     *
     * @return*/
    public boolean preOrderNR(){
        Stack<Node> stack = new Stack<>();
        stack.push(root);

        while(!stack.isEmpty()){
            Node cur = stack.peek();
            stack.pop();
            System.out.println(cur.e);
            if(cur.right!=null){
                stack.push(cur.right);
            }

            if(cur.left!=null){
                stack.push(cur.left);
            }
        }
        return false;
    }

    /**
     * 二分搜索樹廣度遍歷
     * @author weidoudou
     * @date 2022/11/8 11:23
     * @return boolean
     **/
    public boolean levelOrder(){
        Queue<Node> queue = new LinkedList<>();
        queue.add(root);

        while (queue.peek()!=null){
            Node cur = queue.peek();
            System.out.println(cur.e);
            queue.remove();
            if(cur.left!=null){
                queue.add(cur.left);
            }
            if(cur.right!=null){
                queue.add(cur.right);
            }
        }
        return false;
    }


    /**
     * 5     二分搜索樹,中序遍歷 顧名思義,先遍歷左節點,再遍歷根節點,最後遍歷右節點
     * @author weidoudou
     * @date 2022/11/5 14:54
     * @return null
     **/
    public boolean inOrder(){
        inOrder(root);
        return false;
    }

    //前序遍歷 遞歸
    private void inOrder(Node node){
        //終止條件
        if(node==null){
            return;
        }

        //遞歸
        inOrder(node.left);
        System.out.println(node.e);//1
        inOrder(node.right);
    }

    /**
     * 6     二分搜索樹,後序遍歷 顧名思義,先遍歷左節點,再遍歷右節點,最後遍歷根節點
     * @author weidoudou
     * @date 2022/11/5 14:54
     * @return null
     **/
    public boolean postOrder(){
        postOrder(root);
        return false;
    }

    //前序遍歷 遞歸
    private void postOrder(Node node){
        //終止條件
        if(node==null){
            return;
        }

        //遞歸
        postOrder(node.left);
        postOrder(node.right);
        System.out.println(node.e);//1

    }



    /**
     * 基於前序遍歷完成toString打印
     * @author weidoudou
     * @date 2022/11/5 15:20
     * @return java.lang.String
     **/
    @Override
    public String toString() {
        final StringBuffer sb = new StringBuffer();
        generate(root,0);
        return sb.toString();
    }

    private void generate(Node node, int depth){
        generate(depth);
        //1     終止條件
        if(node==null){
            System.out.println("null");
            return;
        }

        //2     遞歸條件
        System.out.println(node.e);
        depth++;
        generate(node.left,depth);
        generate(node.right,depth);
    }

    private void generate(int depth){
        for(int i = 0;i<depth;i++){
            System.out.print("==");
        }
    }

}

 

  • 測試類:
    public static void main(String[] args) {
        BST2<Integer> bst2 = new BST2<>();
        int [] nums = {5,3,6,8,4,2};
        for(int i = 0;i<nums.length;i++){
            bst2.add(nums[i]);
        }

        System.out.println(bst2.preOrder());
        /*System.out.println(bst2.inOrder());
        System.out.println(bst2.postOrder());
        System.out.println(bst2.preOrderNR());*/
        System.out.println(bst2.levelOrder());


        //System.out.println(bst2);
    }

 

  • 測試結果:
5
3
2
4
6
8
false
5
3
6
2
4
8
false

Process finished with exit code 0

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章