一、题目
二、解析
1、首先想到最简单的方法是用一个二元组 (node, level) 来表示状态,它表示某个节点和它所在的层数。
每个新进队列的节点的 level 值都是父亲节点的 level 值加一。
最后根据每个点的 level 对点进行分类,分类的时候我们可以利用哈希表,维护一个以 level 为键,对应节点值组成的数组为值,
广度优先搜索结束以后按键 level 从小到大取出所有值,组成答案返回即可
2、我们可以用一种巧妙的方法修改 BFS:
首先根元素入队
当队列不为空的时候
1、求当前队列的长度 Length
2、依次从队列中取 Length 个元素进行拓展,然后进入下一次迭代
它和 BFS 的区别在于, BFS 每次只取一个元素拓展,而这里每次取 Length个元素。在上述过程中的第 i 次迭代就得到了二叉树的第 i 层的Length个元素。
三、代码
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector <vector <int>> ret;
if (!root) return ret;
queue <TreeNode*> q;
q.push(root);
while (!q.empty()) {
int currentLevelSize = q.size();
ret.push_back(vector <int> ());
for (int i = 1; i <= currentLevelSize; ++i) {
auto node = q.front();
q.pop();
ret.back().push_back(node->val);
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
}
return ret;
}
};
int main()
{
Solution sol;
TreeNode* root = new TreeNode(100);
root->left=new TreeNode(50);
root->right = new TreeNode(60);
root->left->left = new TreeNode(40);
root->left->right = new TreeNode(30);
vector<vector<int>> res=sol.levelOrder(root);
for (auto &row : res) {
for (auto &col : row) {
std::cout << col << ends;
}
std::cout <<std::endl;
}
system("pause");
}
参考: