给出一棵二叉树,返回其节点值的锯齿形层次遍历(先从左往右,下一层再从右往左,层与层之间交替进行
3
/ \
9 20
/ \
15 7
返回其锯齿形的层次遍历为:
[
[3],
[20,9],
[15,7]
]
#include <vector>
#include<deque>
using namespace std;
//Definition of TreeNode :
class TreeNode {
public:
int val;
TreeNode *left, *right;
TreeNode(int val) {
this->val = val;
this->left = this->right = NULL;
}
};
class Solution {
/**
* @param root: The root of binary tree.
* @return: A list of lists of integer include
* the zigzag level order traversal of its nodes' values
*/
public:
TreeNode* Init(TreeNode* &root)
{
char ch = ' ';
cin >> ch;
if ('#' == ch)
{
root = NULL;
}
else
{
root = new TreeNode(atoi(&ch));
Init(root->left);
Init(root->right);
}
return root;
}
vector<vector<int>> zigzagLevelOrder(TreeNode *root) {
// write your code here
vector<int > elem;
vector<vector<int > > result;
if (NULL == root)
{
return result;
}
deque<TreeNode* > deq;
TreeNode* temp = NULL;
deq.push_back(root);
int leverTotalNode = 0;
int currnet = 0;
bool flag = false;//标记从前还是从后向前打印
elem.push_back(root->val);
result.push_back(elem);
elem.resize(0);
while (!deq.empty())
{
leverTotalNode = deq.size();
currnet = 0;
while (currnet<leverTotalNode)
{
temp = deq.front();
deq.pop_front();
if (temp->left != NULL)
{
deq.push_back(temp->left);
elem.push_back(temp->left->val);
}
if (NULL != temp->right)
{
deq.push_back(temp->right);
elem.push_back(temp->right->val);
}
currnet++;
}
if (elem.size()!=0)
{
if (flag == false)//从后向前
{
reverse(elem.begin(), elem.end());
}
flag = !flag;
result.push_back(elem);
elem.resize(0);
}
}
return result;
}
};
int main()
{
TreeNode* root = NULL;
Solution s;
root = s.Init(root);
vector<vector<int > > result = s.zigzagLevelOrder(root);
return 0;
}