`
huntfor
  • 浏览: 195314 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

[leetcode]Binary Tree Zigzag Level Order Traversal

 
阅读更多

新博文地址:

[leetcode]Binary Tree Zigzag Level Order Traversal

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

 BFS的简单变形,一层顺序打印,一层逆序打印,好说,设置一个boolean变形标记这一层该如何打印,每一层打印完毕就将boolean变量取反。顺序打印比较好说,逆序的话借用栈就可以实现;

BFS我的代码风格都一样的,逐层打印就用两个queue,由于想尽量少用JDK代码库的方法,同学们总是吐槽java太赖皮。。。。因此我并没有用Collections.reverse方法,而是手动用了stack。随大家喜欢吧。

          List<List<Integer>> result = new ArrayList<List<Integer>>();
	  public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
		if(root == null){
			return result;
		}
		ArrayDeque<TreeNode> pre = new ArrayDeque<TreeNode>();
		ArrayDeque<TreeNode> post = new ArrayDeque<TreeNode>();
		pre.add(root);
		result.add(new ArrayList<Integer>(Arrays.asList(root.val)));
		boolean zig = false;//表示顺序
		while(!pre.isEmpty()){
			TreeNode node = pre.pop();
			if(node.left != null){
				post.offer(node.left);
			}
			if(node.right != null){
				post.offer(node.right);
			}
			if(pre.isEmpty()){
				if(post.isEmpty()){
					break;
				}
				List<Integer> list = new ArrayList<Integer>();
				if(zig){
					for(TreeNode tem: post){
						list.add(tem.val);
					}
				}else{
					Stack<Integer> stack = new Stack<Integer>();
					for(TreeNode tem : post){
						stack.push(tem.val);
					}
					while(!stack.isEmpty()){
						list.add(stack.pop());
					}
				}
				result.add(list);
				pre = post.clone();
				post.clear();
				zig = !zig;
			}
		}
		return result;
	}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics