135.Binary Tree Zigzag Level Order Traversal

来源:互联网 发布:知乎坚持跑步样貌变化 编辑:程序博客网 时间:2024/05/20 20:21

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;    }

0 0
原创粉丝点击