103. 二叉树的锯齿形层次遍历

给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

例如:
给定二叉树 [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->right
NULL))//是否有右孩子
#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;
}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值