LeetCode 102. Binary Tree Level Order Traversal 解题报告
题目描述
Given a binary tree, return the level order traversal of its nodes’ values. (ie, from left to right, level by level).
示例
Example 1:
Given binary tree [3,9,20,null,null,15,7]
return its level order traversal as:
注意事项
没有明确给出。
解题思路
我的思路:
这道题需要逐层把二叉树的节点值保存起来。其实就是二叉树的层序遍历,使用的是广度优先搜索(Breadth First Search, BFS)。由于需要逐层保存节点的值,所以遍历时额外维护一个深度信息,表示目前访问到的层数,一旦出现目前访问层数小于节点层数,就表示开始下一层的遍历,此时需要把上一层的节点信息保存到结果中。实现方式是普通的BFS,使用队列保存待访问到的节点,每次取出队列头部的节点进行访问,并在有子节点的情况下,将子节点入队,在队列为空时结束遍历。见下面的实现代码。
另一道题LeetCode 107. Binary Tree Level Order Traversal II是要以相反的顺序保存各层的节点值,即先保存最底层的节点值,最后保存根节点的值,只要在这道题的代码中加入一句reverse(result.begin(), result.end())就能通过。
代码
我的代码
/**
* 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) {
int curDepth = 0;
vector<vector<int>> result;
vector<int> temp;
queue<pair<TreeNode*, int>> q;
if (root) {
q.push({root, 0});
while(q.size()) {
pair<TreeNode*, int> cur = q.front();
q.pop();
if (curDepth < cur.second) {
result.push_back(temp);
temp.clear();
curDepth = cur.second;
}
temp.push_back((cur.first)->val);
if ((cur.first)->left)
q.push({(cur.first)->left, curDepth + 1});
if ((cur.first)->right)
q.push({(cur.first)->right, curDepth + 1});
}
result.push_back(temp);
}
return result;
}
};
总结
这道题是使用广度优先搜索,实现方式是使用队列,由于需要判别是否到达下一层,所以需要额外维护一个深度信息,最后只要注意循环结束后要把最后一层的杰电子也添加到结果中就基本能通过。
完成这周的BFS算法题,如果有时间,会另外再做几道相关的题目,继续努力,加油~