题解 | #把二叉树打印成多行#
把二叉树打印成多行
https://www.nowcoder.com/practice/445c44d982d04483b04a54f298796288
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
#include <queue>
#include <vector>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pRoot TreeNode类
* @return int整型vector<vector<>>
*/
vector<vector<int> > Print(TreeNode* pRoot) {
// write code here
vector <vector<int>> level_arr;
if (pRoot == nullptr) {
return level_arr;
}
std::queue<TreeNode*> q;
q.push(pRoot);
TreeNode *cur_node;
while (q.size() > 0) {
int level_nums = q.size();
vector<int> level(level_nums);
// 将当前层中元素依次出队,
for (int i = 0; i < level_nums; ++i) {
cur_node = q.front();
level[i] = cur_node->val;
q.pop();
if (cur_node->left) {
q.push(cur_node->left);
}
if (cur_node->right) {
q.push(cur_node->right);
}
}
level_arr.emplace_back(level);
}
return level_arr;
}
};
二叉树的层次遍历是一个比较经典的使用queue的场景;
- 将root 入队
- 获取队头的元素,放入vector中,然后出队,同时将元素的孩子节点入队
- 循环2,直到队列中没有元素为止
这道题的返回值不是一个数组, 而是一个2D vector,因此需要再队里的访存和存储上做一下改变;
需要将每个层次中的元素都保存到一个vector<int>上;
如果区分队列中的层次呢? 这是一个很好地问题
----------- 修改如下:
- 将root 入队
- 判断队列是否为空
- 获取队列的数量(level_nums), 遍历当前队列中的元素; 遍历方式如下:
- 新建vector, 统计访问的次数 count
- 每次获取队头的元素,放入vector中: vec[i] = cur_node->val
- 将对头元素出队
- 将对头元素的左右子节点入队
- 重复 b,c,d 直到 count = level_nums
- 将step3中的vector追加到vector中,
- 重复 2,3,4 直到队列中元素为空
note_coding 文章被收录于专栏
记录自己的解题思路, 欢迎评价

