码迷,mamicode.com
首页 > 其他好文 > 详细

Leetcode Binary Tree Zigzag level Order Traversal

时间:2014-09-16 15:32:10      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   color   io   ar   for   div   

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]
]

难度95,调试老是TLE,看了一下别人的做法,没懂为啥我的超时了。参考这道题其实还是树的层序遍历Binary Tree Level Order Traversal,如果不熟悉的朋友可以先看看哈。不过这里稍微做了一点变体,就是在遍历的时候偶数层自左向右,而奇数层自右向左。在Binary Tree Level Order Traversal中我们是维护了一个队列来完成遍历,而在这里为了使每次都倒序出来,我们很容易想到用栈的结构来完成这个操作。有一个区别是这里我们需要一层一层的来处理(原来可以按队列插入就可以,因为后进来的元素不会先处理),所以会同时维护新旧两个栈,一个来读取,一个存储下一层结点。总体来说还是一次遍历完成,所以时间复杂度是O(n),空间复杂度最坏是两层的结点,所以数量级还是O(n)(满二叉树最后一层的结点是n/2个)。代码如下:

 1 /**
 2  * Definition for binary tree
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode(int x) { val = x; }
 8  * }
 9  */
10 public class Solution {
11     public ArrayList<ArrayList<Integer>> zigzagLevelOrder(TreeNode root) {
12         ArrayList<ArrayList<Integer>> lists = new ArrayList<ArrayList<Integer>>();
13         if (root == null) return lists; 
14         LinkedList<TreeNode> stack = new LinkedList<TreeNode>();
15         ArrayList<Integer> list = new ArrayList<Integer>();
16         stack.push(root);
17         list.add(root.val);
18         lists.add(list);
19         int level = 1;
20         while (!stack.isEmpty()) {
21             list = new ArrayList<Integer>();
22             LinkedList<TreeNode> newstack = new LinkedList<TreeNode>();
23             while (!stack.isEmpty()) {
24                 TreeNode cur = stack.pop();
25                 if (level % 2 == 0) {
26                     if (cur.left != null) {
27                         list.add(cur.left.val);
28                         newstack.push(cur.left);
29                     }
30                     if (cur.right != null) {
31                         list.add(cur.right.val);
32                         newstack.push(cur.right);
33                     }
34                 }
35                 else {
36                     if (cur.right != null) {
37                         list.add(cur.right.val);
38                         newstack.push(cur.right);
39                     }
40                     if (cur.left != null) {
41                         list.add(cur.left.val);
42                         newstack.push(cur.left);
43                     }
44                 }
45             }
46             level++;
47             if (list.size()>0) {
48                 lists.add(list);
49             }
50             stack = newstack;
51         }
52         return lists;
53     }
54 }

贴一下我的做法,不知为何TLE

 1 /**
 2  * Definition for binary tree
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode(int x) { val = x; }
 8  * }
 9  */
10 public class Solution {
11     public ArrayList<ArrayList<Integer>> zigzagLevelOrder(TreeNode root) {
12         ArrayList<ArrayList<Integer>> lists = new ArrayList<ArrayList<Integer>>();
13         if (root == null) return lists; 
14         LinkedList<TreeNode> stack = new LinkedList<TreeNode>();
15         LinkedList<TreeNode> newstack = new LinkedList<TreeNode>();
16         stack.add(root);
17         int PNuminQ = 1;
18         int CNuminQ = 0;
19         int level = 0;
20         ArrayList<Integer> list = new ArrayList<Integer>();
21         while (!stack.isEmpty()) {
22             TreeNode cur = stack.pop();
23             PNuminQ--;
24             list.add(cur.val);
25             if (level%2 == 0) {
26                 if (root.left != null) {
27                     newstack.push(root.left);
28                     CNuminQ++;
29                 }
30                 if (root.right != null) {
31                     newstack.push(root.right);
32                     CNuminQ++;
33                 }
34             }
35             else if (level%2 == 1) {
36                 if (root.right != null) {
37                     newstack.push(root.right);
38                     CNuminQ++;
39                 }
40                 if (root.left != null) {
41                     newstack.push(root.left);
42                     CNuminQ++;
43                 }
44             }
45             
46             if (PNuminQ == 0) {
47                 PNuminQ = CNuminQ;
48                 CNuminQ = 0;
49                 level++;
50                 lists.add(list);
51                 list = new ArrayList<Integer>();
52                 stack = newstack;
53                 newstack = new LinkedList<TreeNode>();
54             }
55         }
56         return lists;
57     }
58 }

 

Leetcode Binary Tree Zigzag level Order Traversal

标签:des   style   blog   http   color   io   ar   for   div   

原文地址:http://www.cnblogs.com/EdwardLiu/p/3974818.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!