1. 程式人生 > 其它 >演算法31 leetcode102 二叉樹的層序遍歷

演算法31 leetcode102 二叉樹的層序遍歷

先怎麼想不出遞迴解法,想到只能用BFS佇列。。。

BFS

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> v;
        if(root==nullptr) return v;
        queue<TreeNode*> qu;
        qu.push(root);
        while(!qu.empty()){

            int lt=qu.size();
            vector<int> vn;//一維陣列
            for(int i=0;i<lt;i++){
                TreeNode *tp=qu.front();
                vn.push_back(tp->val);
                qu.pop();
                if(tp->left) qu.push(tp->left);
                if(tp->right) qu.push(tp->right);
            }
            v.push_back(vn);//二維陣列
        } 
        return v;
    }
    
};

遞迴解法DFS

public List<List<Integer>> levelOrder(TreeNode root) {
    List<List<Integer>> res = new ArrayList<>();
    levelHelper(res, root, 0);
    return res;
}

public void levelHelper(List<List<Integer>> list, TreeNode root, int level) {
    //邊界條件判斷
    if (root == null)
        return;
    //level表示的是層數,如果level >= list.size(),說明到下一層了,所以
    //要先把下一層的list初始化,防止下面add的時候出現空指標異常
    if (level >= list.size()) {
        list.add(new ArrayList<>());
    }
    //level表示的是第幾層,這裡訪問到第幾層,我們就把資料加入到第幾層
    list.get(level).add(root.val);
    //當前節點訪問完之後,再使用遞迴的方式分別訪問當前節點的左右子節點
    levelHelper(list, root.left, level + 1);
    levelHelper(list, root.right, level + 1);
}