leetcode 103、Binary Tree Zigzag Level Order Traversal,难度medium
0. 题干
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7]
返回锯齿形层次遍历如下:
[
[3],
[20,9],
[15,7]
]
1. 代码
/**
* 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>> zigzagLevelOrder ( TreeNode* root) {
vector<vector<int>> res;
if ( root == NULL )
return {};
queue<TreeNode*> q;
q.push(root);
int level=0;
while ( !q.empty())
{
vector<int>temp; //存放每一层的有元素值
int count = q.size(); //队列大小表示当前层数的元素个数
while(count--) // count-- 逐个对该层元素进行处理
{
TreeNode *t = q.front();
q.pop();
if ( level%2 == 0)
temp.push_back(t->val);
else
temp.insert(temp.begin(), t->val);
if ( t-> left)
q.push(t->left);
if ( t-> right )
q.push(t->right); //将当前元素的vector加入res中
}
level++;
res.push_back(temp);
}
return res;
}
};
2. 简单理解
这个代码逻辑和leetcode 102差不多,可参考我的这篇文章:
leetcode102题解
不过加了层数的判断,重点是下面这几句代码,
if(level%2 ==0)
temp.push_back(t->val);
else
temp.insert(temp.begin(),t->val);
以下层数的表达从第0层开始:
比如举例的二叉树:
第0层:3
第1层:9、20
第二层:15、7
根据题意,偶数层(0也是偶数,但是0不是奇数),都是顺着存储;
奇数层需要反过来存储,比如第1层9、20就要存储为 [20,9],
temp.insert(temp.begin(),t->val);
这句代码通过insert很巧妙的把后存储的放到前面,即实现了反序存储;