135.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.

请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,
* 第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
* 借助两个栈来实现。stack1保存当前正在打印层的结点,Stack2保存stack2正在打印出的结点的孩子结点。
* 当stack1为奇数层时则先放其左孩子,为偶数层时则先放其右孩子。
* 整个循环结束的条件是stack1为空。

/**
	 * 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,
	 * 第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
	 * 借助两个栈来实现。stack1保存当前正在打印层的结点,Stack2保存stack2正在打印出的结点的孩子结点。
	 * 当stack1为奇数层时则先放其左孩子,为偶数层时则先放其右孩子。
	 * 整个循环结束的条件是stack1为空。
	 */
	public List<List<Integer> > zigzagLevelOrder(TreeNode pRoot) {
		List<List<Integer> > result = new ArrayList<List<Integer> >();
		if(pRoot == null){
			return result;
		}
		/*stack1保存当前正在打印层的结点,Stack2保存stack2正在打印出的结点的孩子结点。*/
		Stack<TreeNode> stack1 = new Stack<TreeNode>();
		Stack<TreeNode> stack2 = new Stack<TreeNode>();
		ArrayList<Integer> list;
		TreeNode node ;
		boolean isEnven = false;//表示当前层是否为偶数层
		/*初始化stack1为根结点*/
		stack1.push(pRoot);
		/*循环直到某一层需要打印的结点个数为0*/
		while(!stack1.isEmpty()){
			list = new ArrayList<Integer>();
			/*循环打印出当前层的所有结点*/
			while(!stack1.isEmpty()){
				node = stack1.pop();
				list.add(node.val);
				if(isEnven){//偶数层则先放它的右孩子
					if(node.right!=null){
						stack2.add(node.right);
					}
					if(node.left!=null){
						stack2.add(node.left);
					}
				}else{//奇数层先放它的左孩子
					if(node.left!=null){
						stack2.add(node.left);
					}
					if(node.right!=null){
						stack2.add(node.right);
					}
					}
			}//结束里层while循环
			
			/*把当前层的打印结果加到之前的结果中*/
			result.add(list);
			
			stack1.addAll(stack2);
			stack2.clear();
			/*偶数层变奇数层,奇数层变偶数层*/
			if(isEnven){
				isEnven = false;
			}else{
				isEnven = true;
			}
		}
		return result;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值