您的位置:首页 > 其它

【leetcode 层序遍历】Binary Tree Zigzag Level Order Traversal

2014-11-16 21:17 531 查看

1、题目

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}
,

3
   / \
  9  20
    /  \
   15   7


return its zigzag level order traversal as:

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


2、分析

本题是层序遍历的变形,按“之字形”遍历,其实就是隔一层就把节点反过来遍历:第一层正常遍历,第二行反过来遍历,第三行正常,第四行又反过来,如此交替。
跟上两题本质一样:【leetcode 层序遍历】Binary Tree Level Order Traversal
只需要另外设置一个变量flag,用于判断当前层需不需要反过来遍历。

3、代码

<span style="font-size:18px;">class Solution {
public:
    vector<vector<int> > zigzagLevelOrder(TreeNode *root) {
        vector<vector<int>> result;
        if(!root)  return result;
        vector<int> levelNode;
        queue<TreeNode *> currentQueue,nextQueue;
        TreeNode *currentNode=root;
        currentQueue.push(currentNode);
        bool flag=false;
      while(!currentQueue.empty())
      {
        while(!currentQueue.empty())       /*存放当前层节点的队列不为空,则不断地取出队首节点,同时把下一层节点存进next队列*/
        {
            currentNode=currentQueue.front();
            currentQueue.pop();
            levelNode.push_back(currentNode->val);
            
            if(currentNode->left)  nextQueue.push(currentNode->left);
            if(currentNode->right)  nextQueue.push(currentNode->right);
        }
        /*增加两行,判断该层的节点val需不需要反转,第一行不需要,第二行需要,第三行不需要,第四行需要...交替进行*/
        if(!flag) flag=true;
        else{ reverse(levelNode.begin(),levelNode.end()); flag=false; }
        
        result.push_back(levelNode);
        levelNode.clear();
        
        swap(currentQueue,nextQueue);
      }
      
      return result;
    }
};</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐