解题思路:
二叉树的层序遍历是一道基础的题目,可以使用BFS和DFS两种思路来解决,其中BFS在此题中相对更为简洁。
方法一:使用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)。



京公网安备 11010502036488号