1.Ⅰ
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-lcof/
采用二叉树的层序遍历:可采用递归和迭代的方式遍历
1.1递归
先保存根节点的值,再保存左右节点的值,并进行递归,当当前节点为空时,则直接返回。
代码:
class Solution {
public:
vector<int> ret;//返回的vector
vector<int> levelOrder(TreeNode* root) {
if(root == nullptr)
return {};
_levelOrder(root);
return ret;
}
private:
void _levelOrder(TreeNode* root)
{
if(root == nullptr)
return;
ret.push_back(root->val);//先保存根节点
_levelOrder(root->left);//左子树
_levelOrder(root->right);//右子树
}
};
1.2 迭代
迭代时,需要借助一个辅助队,在队不为空时,保存根节点,再分别对其左右子树进行入队操作。
代码:
class Solution {
public:
vector<int> ret;
vector<int> levelOrder(TreeNode* root) {
if(root == nullptr)
return {};
queue<TreeNode*> _que;
_que.push(root);
while(!_que.empty())
{
int sz = _que.size();//获取当前队列中元素个数
for(int i = 0; i < sz; ++i)//循环出队
{
TreeNode* tmp = _que.front();
_que.pop();
ret.push_back(tmp->val);//保存该根节点的值
if(tmp->left != nullptr)//左不空,先入左
_que.push(tmp->left);
if(tmp->right != nullptr)//右不空,入右
_que.push(tmp->right);
}
}
return ret;
}
};
2.Ⅱ
题目描述:
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-ii-lcof/
依然是对二叉树的层序遍历,只不过保存值的方式不同。
2.1 递归
代码:
class Solution {
public:
vector<vector<int>> vv;
vector<vector<int>> levelOrder(TreeNode* root) {
if(root == nullptr)
return vv;
_levelOrder(root, 0);
return vv;
}
private:
void _levelOrder(TreeNode* root, int index)
{
if(root == nullptr)
return;
if(index >= vv.size())//对每一层分开保存一个vector
vv.push_back(vector<int>());
vv[index].push_back(root->val);//当前层保存节点值
_levelOrder(root->left, index + 1);//左右孩子分别在一下层中保存节点值
_levelOrder(root->right, index + 1);
}
};
2.2 迭代
代码:
class Solution {
public:
vector<vector<int>> vv;
vector<vector<int>> levelOrder(TreeNode* root) {
if(root == nullptr)
return vv;
queue<TreeNode*> _que;
_que.push(root);
int index = 0;//下标,记录当前vector<vector>中,有几个vector
while(!_que.empty())
{
int sz = _que.size();
vv.push_back(vector<int>());
for(int i = 0; i < sz; ++i)//这里的元素个数就相当于目前层中,有几个元素
{
TreeNode* tmp = _que.front();
_que.pop();
vv[index].push_back(tmp->val);
if(tmp->left != nullptr)
_que.push(tmp->left);
if(tmp->right != nullptr)
_que.push(tmp->right);
}
++index;
}
return vv;
}
};
3.Ⅲ
题目描述:
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-iii-lcof/
依然是对二叉树的层序遍历,只不过保存值的方式不同。
3.1 递归
将层序遍历后的二维vector进行逆置。
代码:
class Solution {
public:
vector<vector<int>> vv;
vector<vector<int>> levelOrder(TreeNode* root) {
if(root == nullptr)
return vv;
_levelOrder(root, 0);
for(int i = 1; i < vv.size(); i += 2)//逆置偶数行
reverse(vv[i].begin(), vv[i].end());
return vv;
}
private:
void _levelOrder(TreeNode* root, int index)
{
if(root == nullptr)
return;
if(index >= vv.size())
vv.push_back(vector<int>());
vv[index].push_back(root->val);
_levelOrder(root->left, index + 1);
_levelOrder(root->right, index + 1);
}
};
3.2 迭代
代码:
class Solution {
public:
vector<vector<int>> vv;
vector<vector<int>> levelOrder(TreeNode* root) {
if(root == nullptr)
return vv;
queue<TreeNode*> _que;
int index = 0;
_que.push(root);
while(!_que.empty())
{
int sz = _que.size();
vv.push_back(vector<int>(sz));//直接将该vector中元素给定
for(int i = 0; i < sz; ++i)
{
TreeNode* tmp = _que.front();
_que.pop();
if(index % 2 == 0)//不会逆置
vv[index][i] = tmp->val;
else//会逆置,则从后往前赋值
vv[index][sz - i - 1] = tmp->val;
if(tmp->left != nullptr)
_que.push(tmp->left);
if(tmp->right != nullptr)
_que.push(tmp->right);
}
++index;
}
return vv;
}
};