• 103. Binary Tree Zigzag Level Order Traversal


    欢迎fork and star:Nowcoder-Repository-github

    103. 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.
    
    OJ's Binary Tree Serialization:
    
    The serialization of a binary tree follows a level order traversal, where '#' signifies a path terminator where no node exists below.
    
    Here's an example:
    
       1
      / 
     2   3
        /
       4
        
         5
    
    The above binary tree is serialized as"{1,2,3,#,#,4,#,#,5}". 
    

    解析

    • 思路1:对奇数行vector进行反转
    // 103. Binary Tree Zigzag Level Order Traversal
    class Solution_103 {
    public:
    	vector<vector<int> > zigzagLevelOrder(TreeNode *root) {
    
    		vector<vector<int> > vecs;
    		if (!root)
    		{
    			return vecs;
    		}
    
    		queue<TreeNode*> que;
    		que.push(root);
    
    		int level = 0;
    		while (!que.empty())
    		{
    			int size = que.size();
    			vector<int> vec;
    			while (size--)
    			{
    				TreeNode* temp = que.front();
    				que.pop();
    				vec.push_back(temp->val);
    				if (temp->left)
    				{
    					que.push(temp->left);
    				}
    				if (temp->right)
    				{
    					que.push(temp->right);
    				}
    			}
    			level++;
    			if (!(level % 2))  //实际是偶数行反转,从第0行开始       //奇数层反转vector  bug:level % 2 != 0 
    			{
    				reverse(vec.begin(), vec.end());
    			}
    			vecs.push_back(vec);
    		}
    
    		return vecs;
    	}
    };
    
    
    • 思路2:设置标志位,对奇数行取vector对应的元素
    vector<vector<int> > zigzagLevelOrder(TreeNode* root) {
        if (root == NULL) {
            return vector<vector<int> > ();
        }
        vector<vector<int> > result;
    
        queue<TreeNode*> nodesQueue;
        nodesQueue.push(root);
        bool leftToRight = true;
    
        while ( !nodesQueue.empty()) {
            int size = nodesQueue.size();
            vector<int> row(size);
            for (int i = 0; i < size; i++) {
                TreeNode* node = nodesQueue.front();
                nodesQueue.pop();
    
                // find position to fill node's value
                int index = (leftToRight) ? i : (size - 1 - i);
    
                row[index] = node->val;
                if (node->left) {
                    nodesQueue.push(node->left);
                }
                if (node->right) {
                    nodesQueue.push(node->right);
                }
            }
            // after this level
            leftToRight = !leftToRight;
            result.push_back(row);
        }
        return result;
    }
    
    • 思路3:使用deque双端队列,注意取back()元素,先进right孩子
    
    class Solution {
    public:
        vector<vector<int> > zigzagLevelOrder(TreeNode *root) {
            vector<vector<int> > ans;
            if(root == NULL) return ans;
            deque<TreeNode*> dq; 
            dq.push_back(root);
            int zz = 0;
            while(dq.size())
            {
                vector<int> tmp;
                int h = dq.size();
                int l = 0;
                TreeNode *t;
                while(l < h)
                {
                    if(zz % 2 == 0)
                    {
                        t = dq.front();
                        dq.pop_front();
                        if(t->left)  dq.push_back(t->left);
                        if(t->right) dq.push_back(t->right);
                        tmp.push_back(t->val);
                        h--;
                    }
                    else
                    {
                        t = dq.back();
                        dq.pop_back();
                        if(t->right) dq.push_front(t->right);
                        if(t->left) dq.push_front(t->left);
                        tmp.push_back(t->val);
                        h--;
                    }
                }
                ans.push_back(tmp);
                zz ++;
            }
            return ans;
        }
    };
    

    题目来源

  • 相关阅读:
    exkmp
    欧拉通路、回路
    你有多久没有看过星星
    trie树模板(统计难题)
    SPFA(热浪)
    codevs1958 刺激
    洛谷1290 欧几里得的游戏
    洛谷1016 旅行家的预算
    Spfa算法模板
    Tyvj2017清北冬令营入学测试
  • 原文地址:https://www.cnblogs.com/ranjiewen/p/8267373.html
Copyright © 2020-2023  润新知