zoukankan      html  css  js  c++  java
  • [LeetCode] Binary Tree Zigzag Level Order Traversal

    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]
    ]
    

    confused what "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ.

    Hide Tags
     Tree Breadth-first Search Stack
     
     
    方法一:Binary Tree Level Order Traversal 的双queue法略加修改
    /**
     * Definition for binary tree
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
        public:
            vector<vector<int> > zigzagLevelOrder(TreeNode *root)
            {
                queue<TreeNode*> q1;
                queue<TreeNode*> q2; 
                vector<vector<int> > res;
    
                int depth = 0;
                bool needReverse = false;
                if(root != NULL)
                {   
                    q1.push(root);
                    res.push_back(vector<int> ());
                }   
        
                while(!q1.empty())
                {   
                    TreeNode * p = q1.front();
                    q1.pop();
    
                    res[depth].push_back(p->val);
    
                    if(p->left)
                        q2.push(p->left);
                    if(p->right)
                        q2.push(p->right);
                    if(q1.empty())
                    {   
                        if(needReverse)
                            reverse(res[depth].begin(), res[depth].end());
                        needReverse = ! needReverse;
                        if(!q2.empty())
                        {   
                            swap(q1, q2);
                            depth ++;
                            res.push_back(vector<int> ());
                        }
                    }
                }
                return res;
            }
    };
     
    方法二:一个queue,用NULL来表示一层的结束,在取出的是NULL后,处理这一层,同时如果queue中还有元素,就在压入一个NULL,方法很巧妙
     
    class Solution {
        public:
            vector<vector<int> > zigzagLevelOrder(TreeNode *root)
            {
                vector<vector<int> > res;
                if(root == NULL)
                    return res;
    
                queue<TreeNode*> q;
                vector<int> curVec;
    
                q.push(root);
                q.push(NULL); // mark the layer's end
                bool isLeft2Right = true;
    
                while(!q.empty())
                {   
                    TreeNode * p = q.front();
                    q.pop();
    
                    if(p == NULL)
                    {   
                        if(!isLeft2Right)
                        {   
                            reverse(curVec.begin(), curVec.end());
                        }   
                        res.push_back(curVec);
                        isLeft2Right = !isLeft2Right;
                        curVec.clear();
                        if(!q.empty())// if elements exist in queue
                            q.push(NULL);// mark the layer's end
        
                    }   
                    else
                    {
                        curVec.push_back(p->val);
    
                        if(p->left)
                            q.push(p->left);
                        if(p->right)
                            q.push(p->right);
                    }
                }
                return res;
            }
    };
     

     
  • 相关阅读:
    DataGridView 移动行
    DataGridView 显示提示信息
    模块和类的区别
    C# 流总结
    很口语I'm on my way
    读书笔记_Effective_C++_条款二十三:宁以nonmember、nonfriend替换member函数
    PDB文件:每个开发人员都必须知道的
    qq农场,数据抓包分析,实现源码,图片讲解
    连连看外挂消去算法分析
    关于“服务器提交了协议冲突. Section=ResponseStatusLine"问题请
  • 原文地址:https://www.cnblogs.com/diegodu/p/4403003.html
Copyright © 2011-2022 走看看