LeetCode103 BinaryTreeZigzagLevelOrderTraversal(二叉树Z形层次遍历) Java题解

原创 2015年07月09日 17:08:19

题目:

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

解题:

这题其实和二叉树的层序遍历很类似  仅仅是在这个基础上加上一个左右方向  一开始我的思维被局限住了  写了一个很冗余的代码版本  实现思路是这样的 当需要从右到左输出的时候  我把队列里面的节点输出然后 反序存回队列

代码:

public static List<List<Integer>> zigzagLevelOrder(TreeNode root) {
		
		List<List<Integer>> result=new ArrayList<List<Integer>>();//存放最终结果
		boolean isLeftToRight=false;//从左到右的方向
		Queue<TreeNode> nodeQueue=new LinkedList<>();//存放节点 便于每一层遍历
		
		
		//处理根节点
		if(root==null)
			return result;
		else {
			List<Integer> list=new ArrayList<>();
			list.add(root.val);
			result.add(list);
			nodeQueue.offer(root);
		}
		
		while(!nodeQueue.isEmpty())
		{
			int size=nodeQueue.size();
			List<Integer> tempResult=new ArrayList<>();//用来暂时存放每一层节点的遍历结果
			
			Stack<TreeNode> stack=new Stack<>();//用来辅助将队列倒序
			
			if(isLeftToRight)
			{
				//将队列里面的节点都先出队列进栈再出栈进队列  使得和原来的顺序刚好相反
				for(int i=0;i<size;i++)
				{
					stack.push(nodeQueue.poll());
				}
				while(!stack.isEmpty())
					nodeQueue.offer(stack.pop());
				
				while(size>0)//从左到右
				{
					size--;
					TreeNode tempNode=nodeQueue.poll();
					if(tempNode.left!=null)
					{
						nodeQueue.offer(tempNode.left);
						tempResult.add(tempNode.left.val);
					}
					if(tempNode.right!=null)
					{
						nodeQueue.offer(tempNode.right);
						tempResult.add(tempNode.right.val);
					}
				}
				
				if(!tempResult.isEmpty())  result.add(tempResult);
				//循环退出 表示一层已经遍历完了  这时候重置方向标志位
				isLeftToRight=false;
				
			}
			else {
				//将队列里面的节点都先出队列进栈再出栈进队列  使得和原来的顺序刚好相反
				for(int i=0;i<size;i++)
				{
					stack.push(nodeQueue.poll());
				}
				while(!stack.isEmpty())
					nodeQueue.offer(stack.pop());
				
				while(size>0)//从右到左
				{
					size--;
					TreeNode tempNode=nodeQueue.poll();
					if(tempNode.right!=null)
					{
						nodeQueue.offer(tempNode.right);
						tempResult.add(tempNode.right.val);
					}
					if(tempNode.left!=null)
					{
						nodeQueue.offer(tempNode.left);
						tempResult.add(tempNode.left.val);
					}
				}
				if(!tempResult.isEmpty())  result.add(tempResult);
				//循环退出 表示一层已经遍历完了  这时候重置方向标志位
				isLeftToRight=true;
			}
		}
		
		return result;
		
        
    }

后面看别人的解答,其实完全没有必要在队列中反序  只要在存每一层输出结果的ArrayList中反序存入就可以了  下面是这种思路的代码:

public static List<List<Integer>> zigzagLevelOrder2(TreeNode root) {
		
		List<List<Integer>>  result=new ArrayList<List<Integer>>();//存放最终结果
 		Queue<TreeNode> nodeQueue=new LinkedList<>();//存放节点
		int flag=1;//flag为奇数的时候 从左到右  为偶数的时候从右到左;
		
		if(root==null)
			return result;
		else {
			nodeQueue.add(root);
		}
		
		while(!nodeQueue.isEmpty())
		{
			int count=nodeQueue.size();
			List<Integer> tempResult=new ArrayList<>();
			while(count>0)
			{
				TreeNode tempNode=nodeQueue.poll();
				count--;
				if(flag%2!=0)//从左到右
				{
					tempResult.add(tempNode.val);
				}
				else {//
					tempResult.add(0,tempNode.val);
				}
				
				if(tempNode.left!=null)
					nodeQueue.add(tempNode.left);
				if(tempNode.right!=null)
					nodeQueue.add(tempNode.right);
			}
			if(!tempResult.isEmpty()) result.add(tempResult);
			flag++;
		}
		
		return result;
		
	
	}

}

看代码的长度就知道我之前的有多复杂了 

【LeetCode】103. Binary Tree Zigzag Level Order Traversal 解题报告

转载请注明出处:http://blog.csdn.net/crazy1235/article/details/51471280Subject 出处:https://leetcode.com/pro...
  • crazy1235
  • crazy1235
  • 2016年05月28日 12:04
  • 6254

【LeetCode-面试算法经典-Java实现】【103-Binary Tree Zigzag Level Order Traversal(二叉树分层Z字形遍历)】

【103-Binary Tree Zigzag Level Order Traversal(二叉树分层Z字形遍历)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Give...
  • DERRANTCM
  • DERRANTCM
  • 2015年08月08日 06:35
  • 2685

Leetcode 103 ,Binary Tree Zigzag Level Order Traversal(二叉树Z形分层遍历)

一,问题描述1,1,给定一棵二叉树,从上到下,进行Z字行分层遍历的,即:本层的话从左打到右,那么下层就是从右到左,最后输出结果。2,例如: 3,解题思路: 这题和第102题解法类似,对10...
  • wodedipang_
  • wodedipang_
  • 2016年11月15日 22:08
  • 340

Leetcode 树 Binary Tree Zigzag Level Order Traversal

题意:给定一棵二叉树,返回按zigzag层次遍历的结果 思路: 还是跟前面的Binary Tree Level Order Traversal的思路一样 即从上往下按层遍历二叉树,将每一层的节点存放到...
  • zhsenl
  • zhsenl
  • 2014年05月13日 20:54
  • 913

[LeetCode]Binary Tree Zigzag Level Order Traversal

题目链接:Binary Tree Zigzag Level Order Traversal 题目内容: Given a binary tree, return the zigzag level o...
  • xyt8023y
  • xyt8023y
  • 2015年11月04日 15:12
  • 507

leetcode-java-103. Binary Tree Zigzag Level Order Traversal

/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode...
  • github_34514750
  • github_34514750
  • 2016年08月15日 15:54
  • 159

Binary Tree Zigzag Level Order Traversal -- LeetCode

原题链接: http://oj.leetcode.com/problems/binary-tree-zigzag-level-order-traversal/  这道题其实还是树的层序遍历Binar...
  • linhuanmars
  • linhuanmars
  • 2014年04月26日 04:31
  • 13074

Binary Tree Zigzag Level Order Traversal

Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to...
  • Andrewseu
  • Andrewseu
  • 2014年05月30日 20:50
  • 2625

Binary Tree Zigzag Level Order Traversal (二叉树锯齿形层次遍历)

Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to...
  • cow__sky
  • cow__sky
  • 2014年03月08日 09:27
  • 841

LeetCode103 BinaryTreeZigzagLevelOrderTraversal(二叉树Z形层次遍历) Java题解

题目: Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, fro...
  • u012249528
  • u012249528
  • 2015年07月09日 17:08
  • 701
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LeetCode103 BinaryTreeZigzagLevelOrderTraversal(二叉树Z形层次遍历) Java题解
举报原因:
原因补充:

(最多只允许输入30个字)