binary-tree-zigzag-level-order-traversal

来源:互联网 发布:windows仿mac软件 编辑:程序博客网 时间:2024/06/06 05:29

题目描述

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}”.

举个例子自己画画就知道了,用两个栈进行存储,先压左孩子和先压右孩子交替进行即可.

/** * 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) {        vector<vector<int>> res;        if(root==NULL)            return res;        vector<int> vec;        stack<TreeNode*> sta_lr;        stack<TreeNode*> sta_rl;        sta_lr.push(root);        while(!sta_lr.empty()||!sta_rl.empty()){            while(!sta_lr.empty()){                TreeNode* temp=sta_lr.top();                vec.push_back(temp->val);                if(temp->left)                    sta_rl.push(temp->left);                if(temp->right)                    sta_rl.push(temp->right);                sta_lr.pop();            }            if(!vec.empty()){                res.push_back(vec);                vec.clear();            }            while(!sta_rl.empty()){                TreeNode* temp=sta_rl.top();                vec.push_back(temp->val);                if(temp->right)                    sta_lr.push(temp->right);                if(temp->left)                    sta_lr.push(temp->left);                sta_rl.pop();            }            if(!vec.empty()){                res.push_back(vec);                vec.clear();            }        }     return res;    }};
0 0