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;
    }
};
题目来源
    C/C++基本语法学习
STL
C++ primer
                    
                

                
            
        
浙公网安备 33010602011771号