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.
思路:层次遍历,可以用Queue实现,或者直接用ArrayList实现即可;
注意:是zigzag形的,不是每层都反向
JAVA 代码:
- public ArrayList<ArrayList<Integer>> zigzagLevelOrder(TreeNode root) {
- ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
- if(root==null) return res;
- ArrayList<TreeNode> cur = new ArrayList<TreeNode>();
- cur.add(root);
- int level=0;
- while(cur.size() != 0) {
- ArrayList<Integer> curint = new ArrayList<Integer>();
- if(level % 2 == 0) {
- for(int i=0;i<cur.size();i++) {
- curint.add(cur.get(i).val);
- }
- } else {
- for(int i=cur.size()-1;i>=0;i--) {
- curint.add(cur.get(i).val);
- }
- }
- res.add(curint);
- ArrayList<TreeNode> newcur = new ArrayList<TreeNode>();
- int i=0;
- while(i < cur.size()) {
- if(cur.get(i).left!=null) {
- newcur.add(cur.get(i).left);
- }
- if(cur.get(i).right!=null) {
- newcur.add(cur.get(i).right);
- }
- i++;
- }
- level++;
- cur.clear();
- cur = newcur;
- }
- return res;
- }
思路二:用队列实现,C++代码
- vector<vector<int> > res;
- vector<vector<int> > zigzagLevelOrder(TreeNode *root) {
- queue<TreeNode *> qu;
- if(root==NULL) return res;
- qu.push(root);
- qu.push(NULL);
- vector<int> cur;
- int i=0;
- while(!qu.empty()) {
- TreeNode *tmp = qu.front();
- qu.pop();
- if(tmp!=NULL) {
- cur.push_back(tmp->val);
- if(tmp->left) qu.push(tmp->left);
- if(tmp->right) qu.push(tmp->right);
- } else {
- i++;
- if(i==2) {
- i=0;
- reverse(cur.begin(),cur.end());
- }
- res.push_back(cur);
- cur.clear();
- if(!qu.empty()) qu.push(NULL); //注意只有当queue非空时,才需要压入分隔符;
- }
- }
- return res;
- }
JAVA 中Queue 和 C++ queue区别
JAVA 中接口: add、offer、peek、remove、poll、empty
C++中接口: push、front、pop、empty
JAVA中add和offer的区别
public boolean add(E e) {
if(offer(e)) reture true;
else
throw new IllegalStateException("Queue full");
}
poll 和 remove区别
类似,poll 当queue为空时返回null,而remove返回NoSuchElementException 。

浙公网安备 33010602011771号