1. 二叉树的层次遍历
给定一个二叉树,返回其按层次遍历的节点值(逐层地,从左到右访问所有节点)
思路:利用队列
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res;
queue<TreeNode*> q;
if(root)
{
q.push(root);
}
else
{
return res;
}
while(!q.empty())
{
int len = q.size();
vector<int> temp;
for(int i = 0; i < len; i++)
{
TreeNode* node = q.front();
q.pop();
if(node -> left)
{
q.push(node -> left);
}
if(node -> right)
{
q.push(node -> right);
}
temp.push_back(node -> val);
}
res.push_back(temp);
}
return res;
}
2. 二叉树的锯齿形层次遍历
给定一个二叉树,返回其节点值的锯齿形层次遍历(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)
思路:与上一题思路相同,只需要加一个偶数行反转即可
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
vector<vector<int>> res;
queue<TreeNode*> q;
int level = 1; //奇数层从左往右,偶数层从右往左
if(root)
{
q.push(root);
}
else
{
return res;
}
while(!q.empty())
{
int len = q.size();
vector<int> temp;
for(int i = 0; i < len; i++)
{
TreeNode* node = q.front();
q.pop();
temp.push_back(node -> val);
if(node -> left)
{
q.push(node -> left);
}
if(node -> right)
{
q.push(node -> right);
}
}
if(level % 2 == 0) //偶数行
{
int i = 0;
int j = temp.size() - 1;
while(i <= j)
{
int num = temp[i];
temp[i] = temp[j];
temp[j] = num;
i++;
j--;
}
}
res.push_back(temp);
level++;
}
return res;
}