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

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

例如:
给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
返回锯齿形层次遍历如下:

[
  [3],
  [20,9],
  [15,7]
]


/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector> zigzagLevelOrder(TreeNode* root) {
        vector>out;
        if(root==NULL)
            return out;
        //用队列存储节点指针
        queuerecord;
        //先将根节点给队列
        record.push(root);
        //标志位,用于判断何时将向量颠倒
        bool flag=true;
        while(!record.empty())
        {
            //目前队列中的数量,用n值保存,表示这一层有多少个
            int n=record.size();
            //零时向量,存储每层的值
            vectortmp;
            //循环n次
            while(n--)
            {
                //取出队头
                TreeNode*node=record.front();
                //弹出对头
                record.pop();
                tmp.push_back(node->val);
                //左孩子不为空,将左孩子放入队列中
                if(node->left!=NULL)
                    record.push(node->left);
                //右孩子不为空,将右孩子放入队列中
                if(node->right!=NULL)
                    record.push(node->right);
            }
            //如果flag为假需要将tmp的值颠倒,再将tmp向量加入到out向量中
            if(flag==false)reverse(tmp.begin(),tmp.end());
            //将tmp向量加入到out向量中
            out.push_back(tmp);
            //遍历一层之后,重新置位
            //必须放到遍历之后,
            flag=!flag;
        }
        return out;
    }
};

 

你可能感兴趣的:(算法题)