剑指offer 33- 之字形打印二叉树
2021-05-21 本文已影响0人
顾子豪
请实现一个函数按照之字形顺序从上向下打印二叉树。
即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
样例
输入如下图所示二叉树[8, 12, 2, null, null, 6, 4, null, null, null, null]
8
/ \
12 2
/ \
6 4
输出:[[8], [2, 12], [6, 4]]
分析:
(BFS) O(n)
在上一道题《分行从上往下打印二叉树》 的基础上修改代码。
增加一个行号标记i,偶数行直接reverse一下
时间复杂度分析:每个点遍历一次,所以时间复杂度是 O(n)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> printFromTopToBottom(TreeNode* root) {
vector<vector<int>> res;//二维数组用于存放结果元素
queue<TreeNode*> q;//定义一个队列来模拟BFS
if(!root) return res;//根元素为空,什么也不做,直接返回res
q.push(root);//把根节点放入队列中
int i = 1; //i用来记录行号
q.push(nullptr);//NULL作为行末尾标记
vector<int> cur;// cur用来存放当前行的元素
while(q.size()) {//队列中只要还有元素就进行操作
auto x = q.front();//访问队首元素
q.pop();//删掉队首元素
if(x) {//x为true,说明该行还有元素需要操作
cur.push_back(x->val);// 当前元素存入cur中
if(x->left) q.push(x->left);//将左儿子放入队列中
if(x->right) q.push(x->right);//将右儿子放入队列中
} else {//x为false,说明已经访问行尾标志NULL
if (q.size()) q.push(nullptr);//行元素已经在队列中了,这是增加新的行标记NULL
if(i % 2 == 0) reverse(cur.begin(), cur.end()); //偶数行的元素翻转一下
res.push_back(cur); //把当前行的元素存放在结果数组中
cur.clear();//把当前行的元素清空
i++;// 当前行完成,行号加1
}
}
return res;
}
}