解题思路:

二叉树的层序遍历是一道基础的题目,可以使用BFS和DFS两种思路来解决,其中BFS在此题中相对更为简洁。
BFS

DFS

方法一:使用BFS遍历

class Solution {
public:
    /**
     * 
     * @param root TreeNode类 
     * @return int整型vector<vector<>>
     */
    vector<vector<int> > levelOrder(TreeNode* root) {
        // write code here
        vector<vector<int>> ans;
        if(root==nullptr)    
            return ans;
        queue<TreeNode*> q;
        q.push(root);
        while(!q.empty()){
             //sz记住当前层的节点数量,方便确定执行该层的遍历次数。
            int sz=q.size();
            vector<int> cur;
            while(sz--){
                TreeNode* tmp=q.front();
                q.pop();
                cur.push_back(tmp->val);
                if(tmp->left)
                    q.push(tmp->left);
                if(tmp->right)
                    q.push(tmp->right);
            }
            ans.push_back(cur);
        }
        return ans;
    }
};

复杂度分析

时间复杂度:O(n),n为节点数量,BFS对每个节点访问一次。
空间复杂度:O(n),空间复杂度在于队列中存储节点的最大值,当该二叉树为满二叉树时,最大数量为(n+1)/2。

方法二:使用DFS遍历

class Solution {
public:
    /**
     * 
     * @param root TreeNode类 
     * @return int整型vector<vector<>>
     */
    vector<vector<int> > levelOrder(TreeNode* root) {
        // write code here
        vector<vector<int>> ans;
        dfs(ans,root,0);
        return ans;
    }
    void dfs(vector<vector<int>>& ans,TreeNode* root,int level){
        if(root==nullptr) return;
        //当前层数超过了ans的大小,需要新增一个vector<int>
        if(level>=ans.size())
            ans.push_back(vector<int>());
        ans[level].push_back(root->val);
        dfs(ans,root->left,level+1);
        dfs(ans,root->right,level+1);
    }
};

复杂度分析

时间复杂度:O(n),n为节点数量,DFS对每个节点访问一次,因此递归调用n次,每次调用执行常数次操作,时间复杂度O(n)。
空间复杂度:O(n),空间复杂度在于递归调用深度和每次递归调用辅助空间,辅助空间为常数级,与节点深度相关,当节点深度为n时最大,为O(n)。