文章目录
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印
题目描述
题目链接
解题思路
运用队列的性质
class Solution {
public:
vector<int> levelOrder(TreeNode* root)
{
TreeNode* cur=root;
queue<TreeNode*> q;
vector<int> v;
if(root!=NULL)
{
q.push(root);
}
while(!q.empty())
{
TreeNode* front=q.front();
q.pop();
v.push_back(front->val);
if(front->left)
{
q.push(front->left);
}
if(front->right)
{
q.push(front->right);
}
}
return v;
}
};
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行
题目描述
题目链接
解题思路
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root)
{
vector<vector<int>>vv;
queue<TreeNode*>q;
if(root!=NULL)
{
q.push(root);
}
while(!q.empty())
{
//通过控制每一层的数据个数,一个循环一层数据一层数据出
//当n层出完了,n+1层就进队列,q.size()就是n+1层的数据个数,循环在做处理
int levelSize=q.size();
vector<int> v;
for(size_t i=0;i<levelSize;i++)
{
TreeNode* front=q.front();
v.push_back(front->val); //把这一层数据入到一维数组中去,第一层只有一个根节点
q.pop();
if(front->left)
{
q.push(front->left);
}
if(front->right)
{
q.push(front->right);
}
}
vv.push_back(v); //把这一层数据入到二维数组里面去
}
return vv;
}
};
实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推
题目描述
题目链接
解题思路
在题目二的基础上设置一个flag标志位
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root)
{
vector<vector<int>>vv;
queue<TreeNode*> q;
if(root!=NULL)
{
q.push(root);
}
int flag=1;
while(!q.empty())
{
vector<int> v;
int levelSize=q.size();
for(size_t i=0;i<levelSize;i++)
{
TreeNode* front=q.front();
q.pop();
v.push_back(front->val);
if(front->left)
{
q.push(front->left);
}
if(front->right)
{
q.push(front->right);
}
}
//因为第一层不需要翻转,第二层需要,第三次也不需要,所以设置一个flag起始为1
if(flag) //如果当前正序,设置下一层倒序
{
flag=0;
}
else //如果当前层要倒序输出,则翻转vector
{
reverse(v.begin(),v.end());
flag=1; //设置下一层正序
}
vv.push_back(v);
}
return vv;
}
};