题目分析:[[EVD]] - 剑指 Offer 32 - III. 从上到下打印二叉树 III
https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-iii-lcof/
简单描述:
- 二叉树之字形打印,每一层一组
限制🚫
- 节点总数
- 按照之字形顺序打印二叉树,第一层 左➡️右,第二层 右➡️左...
示例:
3
/ \
9 20
/ \
15 7
输入:[3,9,20,null,null,15,7]
输出:
[
[3],
[20,9],
[15,7]
]
解题思路:
思路:
- #BFS 层序遍历,对输出进行结构化,可借用#双端队列
- 奇数层正序,偶数层反序
- 1.利用algorithm库中函数reverse(底层实现为元素交换) #[[C++ STL]]
- 2.利用deque双端队列进行操作 #[[C++ STL]]
- 偶数层➡️队列头部,奇数层➡️队列尾部
- 奇数层正序,偶数层反序
效率:
- 时间复杂度
- 空间复杂度
代码:
- 1.层序遍历+反序
class Solution
{
public:
/*简单BFS,对输出结构化,奇数层左到右,偶数层右到左*/
vector<vector<int> > levelOrder(TreeNode *root)
{
vector<vector<int> > res;
if (!root)
return res;
queue<TreeNode *> q;
q.push(root);
while (!q.empty())
{
vector<int> tmp;
int tmpI = q.size(); // 循环中q队列长度会改变,因此设定一个固定值
while (tmpI--)
{
TreeNode *tmpT = q.front();
q.pop();
tmp.push_back(tmpT->val);
if (tmpT->left)
q.push(tmpT->left);
if (tmpT->right)
q.push(tmpT->right);
}
if (res.size() % 2 == 1) // res已存在奇数个[]时,该层为偶数层,反序
reverse(tmp.begin(), tmp.end());
res.push_back(tmp);
}
return res;
}
};