1. 程式人生 > 實用技巧 >LeetCode DFS、BFS篇(102)

LeetCode DFS、BFS篇(102)

102. 二叉樹的層序遍歷

給你一個二叉樹,請你返回其按 層序遍歷 得到的節點值。 (即逐層地,從左到右訪問所有節點)。

示例:
二叉樹:[3,9,20,null,null,15,7],

3

/
9 20
/
15 7
返回其層次遍歷結果:

[
[3],
[9,20],
[15,7]
]

//思路1BFS,優化廣度遍歷,一層一層放進deque進行遍歷,遍歷完一層就用list裝完加入res
//思路2DFS,每一層遞迴都用index做標記

solution1 BFS 迭代

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        ArrayDeque<TreeNode> deque = new ArrayDeque<>();
        if (root != null) {
            deque.add(root);
        }
        while (!deque.isEmpty()){
            int n = deque.size();
            List<Integer> level = new ArrayList<>();
            for (int i = 0;i<n;i++){
                TreeNode node = deque.pop();
                level.add(node.val);
                if (node.left!=null){
                    deque.add(node.left);
                }
                if (node.right!=null){
                    deque.add(node.right);
                }
            }
            res.add(level);
        }
        return res;
    } 
}

solution 2 DFS 遞迴

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if (root == null){
            return res;
        }
        dfs(res,root,1);
        return res;
    }
    public void dfs(List<List<Integer>> res,TreeNode node,int index){
        if (res.size()<index){
            res.add(new ArrayList<Integer>());
        }
        res.get(index-1).add(node.val);
        if (node.left != null){
            dfs(res,node.left,index+1);
        }
        if (node.right != null){
            dfs(res,node.right,index+1);
        }
    }
}