剑指 Offer 32 - I. 从上到下打印二叉树
解题思路:
采用层序遍历的思想,借助辅助队列完成节点打印.
- 当树的根节点为空,则直接返回空列表 [] ;
- 先将根节点入队
- 队列空则跳出循环:弹出队首节点node,将node的值加入列表res中,然后将node的非空左右节点入队.
- 返回res列表.
class Solution {
public:
vector<int> levelOrder(TreeNode* root) {
//层序遍历二叉树打印 借助辅助队列
queue<TreeNode*> que;
vector<int> res;
if(root == NULL)
return {};
que.push(root);
while(!que.empty())
{
TreeNode *node = que.front();
que.pop();
res.push_back(node->val);
if(node->left != NULL)
{
que.push(node->left);
}
if(node->right != NULL)
{
que.push(node->right);
}
}
return res;
}
};
剑指 Offer 32 - II. 从上到下打印二叉树 II
解题思路:
在每层的末位添加特殊标记
- 当树的根节点为空,则直接返回空列表 [] ;
- 先将根节点入队,然后加入特殊标志pMark
- 队列空则跳出循环:
1)弹出队首节点node,将node的值加入列表volum中;
2)然后将node的非空左右节点入队;
3)判断队首元素是否为特殊标记,是则先弹出队首元素,然后将列表volum加入到数组集合res中,将特殊标记加入队列末尾;否则继续循环. - 返回res列表.
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
if(root == NULL)
return {};
//在每层的末位加特殊标记
queue<TreeNode*> que;
vector<vector<int>> res;
vector<int> volum;
TreeNode *pMark = 0;
que.push(root);
que.push(pMark);
while(!que.empty())
{
TreeNode *node = que.front();
que.pop();
volum.push_back(node->val);
if(node->left != NULL)
que.push(node->left);
if(node->right != NULL)
que.push(node->right);
if(que.front() == pMark)
{
que.pop();
res.push_back(volum);
volum.clear();
if(!que.empty())
que.push(pMark);
}
}
return res;
}
};