Binary Tree Zigzag Level Order Traversal

来源:互联网 发布:莱斯特城奇迹 知乎 编辑:程序博客网 时间:2024/06/05 06:27

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 intusing 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指针,另一个队列用来存储下一个将要访问的levelvector<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;}

测试:

这里写图片描述

0 0
原创粉丝点击