[leetcode] 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,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

return its zigzag level order traversal as:

[
  [3],
  [20,9],
  [15,7]
]

分析:题目要求之字形层次遍历一个二叉树。

思路一:层次遍历肯定想到用BFS,习惯于用队列queue实现,这个问题实现思路也比较简单,维持一个boolean类型变量表示:0代表从右到左,1代表从左到右就可以了。

就不贴上代码了。

思路二:既然可以用队列,肯定也可以用栈做。维持两个栈实现功能,代码如下:

 1 class Solution {
 2     List<List<Integer>> res = new ArrayList<>();
 3     Stack<TreeNode> l_r = new Stack<>();
 4     Stack<TreeNode> r_l = new Stack<>();
 5     public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
 6         if ( root == null ) return res;
 7         l_r.push(root);
 8         List<Integer> a = new ArrayList<>();
 9         a.add(root.val);
10         res.add(a);
11         while ( !l_r.isEmpty() || !r_l.isEmpty() ){
12             if ( !l_r.isEmpty() ){
13                 int size = l_r.size();
14                 List<Integer> list = new ArrayList<>();
15                 for ( int i = 0 ; i < size ;i ++ ){
16                     TreeNode t = l_r.pop();
17                     if ( t.right != null ) {
18                         list.add(t.right.val);
19                         r_l.push(t.right);
20                     }
21                     if ( t.left != null ) {
22                         list.add(t.left.val);
23                         r_l.push(t.left);
24                     }
25                 }
26                 if ( !list.isEmpty() ) res.add(list);
27             }
28             if ( !r_l.isEmpty()){
29                 int size = r_l.size();
30                 List<Integer> list = new ArrayList<>();
31                 for ( int i = 0 ; i < size ;i ++ ){
32                     TreeNode t = r_l.pop();
33                     if ( t.left != null ) {
34                         list.add(t.left.val);
35                         l_r.push(t.left);
36                     }
37                     if ( t.right != null ) {
38                         list.add(t.right.val);
39                         l_r.push(t.right);
40                     }
41 
42                 }
43                 if ( !list.isEmpty() ) res.add(list);
44             }
45         }
46         return res;
47     }
48 }

    AC 2ms,看了一下1ms的答案,都是用queue做的,因为比较熟了。就不写queue的代码了。

posted @ 2018-10-18 14:47  Lin.B  阅读(124)  评论(0编辑  收藏  举报