给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/
9 20
/
15 7
返回锯齿形层次遍历如下:
[
[3],
[20,9],
[15,7]
]
解题思路:
此题的锯齿的含义是奇数行从左到右,偶数行从右到左,以此进行遍历即可。
C++代码:
#define hasLChild(x) (!(x->leftNULL))//是否有左孩子
#define hasRChild(x) (!(x->rightNULL))//是否有右孩子
#define hasOnlyLC(x) (hasLChild(x)&&!hasRChild(x))//是否只有左孩子
#define hasOnlyRC(x) (!hasLChild(x)&&hasRChild(x))//是否只有右孩子
#define hasDouleChild(x) (hasLChild(x)&&hasRChild(x))//是否有两个孩子
#define hasNoChild(x) (!hasLChild(x)&&!hasRChild(x))//是否没有孩子
#define Same_Struct_TreeNode(x,y) ((hasOnlyLC(x)&&hasOnlyLC(y))||(hasOnlyRC(x)&&hasOnlyRC(y))||(hasDouleChild(x)&&hasDouleChild(y))||(hasNoChild(x)&&hasNoChild(y)))//两节点x,y的结构是否相同
class Solution {
public:
vector<vector> zigzagLevelOrder(TreeNode* root) {
if (root == NULL) return{};
vector<vector> res = {};
vector INT = {};
stack<TreeNode*> S, S_temp;
S.push(root);
int sgn = 1; TreeNode* temp;
while (!S.empty())
{
INT = {};
int size = S.size();
while (!S_temp.empty()) S_temp.pop();
for (int i = 1; i <= size; i++)
{
temp = S.top();
if (temp != NULL)
{
if (sgn % 2 == 1)
{
INT.push_back(temp->val);
S_temp.push(temp->left);
S_temp.push(temp->right);
}
else
{
INT.push_back(temp->val);
S_temp.push(temp->right);
S_temp.push(temp->left);
}
}
S.pop();
}
S = S_temp;
sgn++;
if (int(INT.size()) > 0) { res.push_back(INT); }
}
return res;
}
};