1.题目
返回二叉树的层次遍历。
2.思路
节点的访问次序可概括为“先上后下,先左后右”——先访问根节点,再依次是左子节点,右子节点,左子节点的左子节点,左子节点的右子节点,右子节点的左子节点,右子节点的右子节点……以此类推。
3.实现
3.1 非递归版本
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> results;
if(root == nullptr)
return res;
queue<TreeNode*> q;
q.push(root);
while(!q.empty())
{
int size = q.size();
vector<int> result;
for(int i = 1; i <= size; i++)
{
TreeNode* node = q.front();
q.pop();
result.push_back(node->val);
if(node->left != nullptr) q.push(node->left);
if(node->right != nullptr) q.push(node->right);
}
results.push_back(result);
}
return results;
}
};
3.2 递归版本
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> results;
if(root == nullptr)
return results;
helper(root, 0, results); //根节点 在 level = 0层
return results;
}
private:
void helper(TreeNode* root, int level, vector<vector<int>>& results)
{
// 将level层的全部节点组成的向量 添加到results中
if(root == nullptr)
return;
if(results.size() == level) //例如level = 2 是已经添加了 level = 0,1层的元素,results.size() = 2 此时可以创建新的向量存放 level = 2 层的节点值
results.push_back(vector<int>()); //空向量
results[level].push_back(root->val); //最主要的是这个level
helper(root->left, level + 1, results);
helper(root->right, level + 1, results);
}
};