剑指 32_2 分行从上到下打印二叉树
全部刷题与学习记录
原题目
题目地址:剑指 Offer 32 - II. 从上到下打印二叉树 II
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
例如:
给定二叉树: [3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
考查知识点
层序遍历、广度优先遍历
忘记层序遍历的话,先看这一篇最基础的层序遍历 剑指 32 从上到下打印二叉树【宽度/广度优先遍历】【BFS】
自己的第一遍解法
一开始想错了,被简单的例子限制思路,以为二维数组中的一维数组就是当前节点curNode
的两个子节点,没有考虑一层中有多套子节点的情况。上一个错误代码:
class Solution_01 {//失败,将一个根节点的两个子节点当成一个数组,没有实现一层有两套子节点时的数组拼接
public:
vector<vector<int>> levelOrder(TreeNode* root) {
if (root == nullptr)
return vector<vector<int>> {};
deque<TreeNode*> dNode = {root};
vector<vector<int>> res = {{root->val},};
while (!dNode.empty())
{
TreeNode* curNode = dNode.front();
dNode.pop_front();
vector<int> tmpRes = {};
if (curNode->left)
{
dNode.push_back(curNode->left);
tmpRes.push_back(curNode->left->val);
}
if (curNode->right)
{
dNode.push_back(curNode->right);
tmpRes.push_back(curNode->right->val);
}
if (!tmpRes.empty())
res.push_back(tmpRes);
}
return res;
}
};
好的解法
这一题就是在层序遍历的基础上,要知道每一层的节点数量nextLevel
和当前层还要存储的节点toBeOut
。这样才能结束一个一维数组(当前层节点全部存储完毕),进入下一个一维数组(开始存储下一层的节点)
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
if (root == nullptr)
return vector<vector<int>> {};
deque<TreeNode*> dNode = {root};
vector<vector<int>> res;
int nextlevel = 0;//下一层的节点数量
int toBeOut = 1;//本层剩余要输出的节点数量
vector<int> tmpRes = {};//保存本层的节点数值
while (!dNode.empty())
{
TreeNode* curNode = dNode.front();
tmpRes.push_back(curNode->val);
dNode.pop_front();
toBeOut--;//处理完当前节点
if (curNode->left)
{
dNode.push_back(curNode->left);
nextlevel++;//确认:下一层要处理一个节点
}
if (curNode->right)
{
dNode.push_back(curNode->right);
nextlevel++;
}
if (toBeOut == 0) {//当前层处理完,开始处理下一层,即开始保存新的一维数组
res.push_back(tmpRes);
tmpRes = {};
toBeOut = nextlevel;
nextlevel = 0;
}
}
return res;
}
};
测试代码放在下面:
int main()
{
Solution so;
TreeNode x1(1), x2(2), x3(3), x4(4), x5(5);
x1.left = &x2; x1.right = &x3;
x2.left = &x4; x3.right = &x5;
vector<vector<int>> res = so.levelOrder(&x1);
for( auto bigE: res)
{
for( auto smallE: bigE)
cout << smallE << " ";
cout << endl;
}
}