您的位置:首页 > 其它

Binary Tree Zigzag Level Order Traversal

2016-08-24 09:10 344 查看
Description:

Given a binary tree, return the zigzag level order traversal of its nodes’ values. (ie, from left to right,

then right to left for the next level and alternate between).

For example: Given binary tree 3,9,20,#,#,15,7,



return its zigzag level order traversal as:



分析:广度优先遍历,用一个bool记录从左到右,或从右到左(翻转一下即可)。

#include <iostream>
#include <queue>
#include <vector>

#define Elementype int

using namespace std;

typedef struct TreeNode //树结点
{
Elementype  val;
TreeNode *left;
TreeNode *right;
TreeNode(Elementype x) : val(x), left(nullptr), right(nullptr) {}
} *Tree;

int index = 0;  //全局索引变量

//使用先序遍历创建创建二叉树
void MakeBinaryTree(Tree &T, Elementype value[])
{
Elementype  c = value[index++];
if (c == '#')
T = nullptr;
else
{
T = new TreeNode(c);
MakeBinaryTree(T->left, value);
MakeBinaryTree(T->right, value);
}

}

//使用两个队列,一个队列用来存放当前level指针,另一个队列用来存储下一个将要访问的level
vector<vector<Elementype> >  BinaryTreepostorderTraversal(Tree root)
{
queue<Tree> curQue, nextQue;
vector<vector<Elementype> > result;
vector<Elementype> level;
bool flag = false;  //记录从左到右,还是从右到左
Tree p = root;
curQue.push(p);

while (!curQue.empty())
{
p = curQue.front();
level.push_back(p->val);
curQue.pop();
if (p->left != nullptr)
nextQue.push(p->left);
if (p->right != nullptr)
nextQue.push(p->right);
if (curQue.empty())
{
if (flag)
{
reverse(level.begin(),level.end());
result.push_back(level);
flag = false;
}
else
{
result.push_back(level);
flag = true;
}

level.clear();
swap(nextQue, curQue);
}

}

return result;
}

int main()
{
Tree T = nullptr;

//注意,每个结点都要有值,注意这里的取值不要等于35,即#
vector<vector<Elementype>> result;
Elementype data[11] = { 3, 9, '#', '#', 20, 15, '#', '#', 7, '#', '#' };

MakeBinaryTree(T, data);
result = BinaryTreepostorderTraversal(T);

cout << "[" << endl;
for (auto &s : result)
{
cout << " [";
for (auto &t : s)
cout << t << " ";
cout << "]," << endl;
}
cout << "]" << endl;
system("pause");

return 0;
}


测试:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: