二叉树的层次遍历,一般都是使用bfs按层遍历,本题主要是注意一下二叉树中每一层的长度。但是使用dfs也是一种挺不错的方法!(时间复杂度和空间复杂度是直接抄官方的,dfs使用递归容易爆栈,bfs是额外开了一个队列,长度接近于n)。有什么错误的地方,欢迎大佬们指正哈!!
方法一:广度优先搜索(bfs)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res;
if(root == nullptr) return res;
queue<TreeNode*> q;
q.push(root);
while(!q.empty()) {
//记录二叉树当前层的大小
int levelSize = q.size();
vector<int> cur;
for(int i = 0; i < levelSize; i++) {
TreeNode* curNode = q.front();
q.pop();
cur.push_back(curNode->val);
if(curNode->left != nullptr)
q.push(curNode->left);
if(curNode->right != nullptr)
q.push(curNode->right);
}
res.push_back(cur);
}
return res;
}
};
时间复杂度:O(n),每个节点被运算一次
空间复杂度:O(n),保存输出结果的数组包含 N 个节点的值
方法二:深度优先搜索(dfs)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
private:
vector<vector<int>> res;
void dfs(TreeNode* node, int level) {
//当前层还未生成动态数组时,插入一个空数组
if(res.size() == level) {
vector<int> empty;
res.push_back(empty);
}
res[level].push_back(node->val);
if(node->left) dfs(node->left, level+1);
if(node->right) dfs(node->right, level+1);
}
public:
vector<vector<int>> levelOrder(TreeNode* root) {
if(root == nullptr) return res;
dfs(root, 0);
return res;
}
};
时间复杂度:O(n),每个节点被运算一次
空间复杂度:O(n),保存输出结果的数组包含 N 个节点的值