您的位置:首页 > 其它

Binary Tree Zigzag Level Order Traversal

2013-12-14 16:41 246 查看
居然一次就过了!喜大普奔啊有木有!

先上图,方便理解,左侧编号为level号。



在这里不能使用队列那种普通的广搜方法,那么怎么办呢?答案是用栈。

我使用了两个栈,记为s0和s1。我们首先将root推入s0,然后就开始对两个栈进行访问。在访问level为偶数的层时,从s0栈中往外弹节点,并且,将它的子女按照从左到右的顺序压入s1。在访问level为奇数的栈时,从s1往外弹节点,并且将其子女按从右到左的顺序压入s0。

这样一来就可以实现题目要求的访问了。可以对着图多看一会儿。

/**
* Definition for binary tree
* 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 res;
stack<TreeNode *> s0, s1;
int level = 0;
s0.push(root);
while (!s0.empty() || !s1.empty()) {
vector<int> tmp;
if (level % 2 == 0) {
while (!s0.empty()) {
TreeNode *t = s0.top();
s0.pop();
if (t->left != NULL)
s1.push(t->left);
if (t->right != NULL)
s1.push(t->right);
tmp.push_back(t->val);
}
}
else {
while (!s1.empty()) {
TreeNode *t = s1.top();
s1.pop();
if (t->right != NULL)
s0.push(t->right);
if (t->left != NULL)
s0.push(t->left);
tmp.push_back(t->val);
}
}
level++;
res.push_back(tmp);
}
return res;
}
};

当然还有更简单的方法,就是还是和普通一样进行广搜,不同的是在最后将每层的序列推入结果时,如果是从右到左访问的话,将序列翻转一下再推入最后的结果就可以了。

http://oj.leetcode.com/problems/binary-tree-zigzag-level-order-traversal/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: