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 代码:

  1. public ArrayList<ArrayList<Integer>> zigzagLevelOrder(TreeNode root) {
  2. ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
  3. if(root==null) return res;
  4. ArrayList<TreeNode> cur = new ArrayList<TreeNode>();
  5. cur.add(root);
  6. int level=0;
  7. while(cur.size() != 0) {
  8. ArrayList<Integer> curint = new ArrayList<Integer>();
  9. if(level % 2 == 0) {
  10. for(int i=0;i<cur.size();i++) {
  11. curint.add(cur.get(i).val);
  12. }
  13. } else {
  14. for(int i=cur.size()-1;i>=0;i--) {
  15. curint.add(cur.get(i).val);
  16. }
  17. }
  18. res.add(curint);
  19. ArrayList<TreeNode> newcur = new ArrayList<TreeNode>();
  20. int i=0;
  21. while(i < cur.size()) {
  22. if(cur.get(i).left!=null) {
  23. newcur.add(cur.get(i).left);
  24. }
  25. if(cur.get(i).right!=null) {
  26. newcur.add(cur.get(i).right);
  27. }
  28. i++;
  29. }
  30. level++;
  31. cur.clear();
  32. cur = newcur;
  33. }
  34. return res;
  35. }

思路二:用队列实现,C++代码

  1. vector<vector<int> > res;
  2. vector<vector<int> > zigzagLevelOrder(TreeNode *root) {
  3. queue<TreeNode *> qu;
  4. if(root==NULL) return res;
  5. qu.push(root);
  6. qu.push(NULL);
  7. vector<int> cur;
  8. int i=0;
  9. while(!qu.empty()) {
  10. TreeNode *tmp = qu.front();
  11. qu.pop();
  12. if(tmp!=NULL) {
  13. cur.push_back(tmp->val);
  14. if(tmp->left) qu.push(tmp->left);
  15. if(tmp->right) qu.push(tmp->right);
  16. } else {
  17. i++;
  18. if(i==2) {
  19. i=0;
  20. reverse(cur.begin(),cur.end());
  21. }
  22. res.push_back(cur);
  23. cur.clear();
  24. if(!qu.empty()) qu.push(NULL); //注意只有当queue非空时,才需要压入分隔符;
  25. }
  26. }
  27. return res;
  28. }

 

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 。

posted @ 2014-06-30 23:24  purejade  阅读(82)  评论(0)    收藏  举报