1. 程式人生 > >Breadth-first Search(廣度優先搜尋)專題1

Breadth-first Search(廣度優先搜尋)專題1

廣度優先搜尋的定義
廣度優先搜尋BFS類似於樹的層次遍歷演算法。基本思想是:首先訪問頂點v,然後由v出發,依次訪問v的各個未被訪問過的頂點w1,w2,w3…wn。然後再訪問wi(wi是w1,w2,w3…wn中的一個)未被訪問過的鄰接點。以此類推,直到所有的頂點都被訪問過。BFS是一種分層查詢的過程,每向前一步就訪問一批頂點。不同於深度優先搜尋那樣有回退的情況。為了實現演算法,需要藉助於一個輔助佇列並且以非遞迴的形式來實現。(來自網頁

559. Maximum Depth of N-ary Tree

在這裡插入圖片描述

思路:對於上面這棵樹,BFS與DFS遍歷節點順序不同。
BFS: 1 3 2 4 5 6
DFS: 1. 3 5 6 2 4

程式碼

107. Binary Tree Level Order Traversal II

BFS使用queue實現非遞迴,是有一個模板的。

public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> levelTraversal = new ArrayList<List<Integer>>();
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        if(root!=null){
            queue.add(root);
        }
        while(!queue.isEmpty()){
            int size = queue.size();//長度
            List<Integer> level = new ArrayList<Integer>();
            for(int i=0;i<size;i++){//遍歷本次元素
                TreeNode node = queue.poll();
                level.add(node.val);//做事情
                //新增子節點
                if(node.left!=null) queue.add(node.left);
                if(node.right!=null) queue.add(node.right);
            }
            levelTraversal.add(0,level);
        }
        return levelTraversal;
    }

這道題目也可以使用遞迴版,不過使用的有點勉強.

 public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> levelTraversal = new ArrayList<List<Integer>>();
        levelMaker(root, levelTraversal, 0);
        return levelTraversal;
    }

    private void levelMaker(TreeNode node, List<List<Integer>> result, int level) {
        if (node == null) return;
        if (result.size() <= level) {
            result.add(0, new ArrayList<Integer>());
        }
        result.get(result.size() - 1 - level).add(node.val);
        levelMaker(node.left, result, level + 1);
        levelMaker(node.right, result, level + 1);
    }

程式碼