【leetcode】Binary Tree Zigzag Level Order Traversal
2014-07-19 16:25
411 查看
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
return its zigzag level order traversal as:
题解:首先设置一个变量zigZag表示在遍历下一层的时候,是否需要逆序,zigZag为true,表示下一层需要逆序,否则下一层不需要逆序。如果不需要逆序,那么在生成nextLevel的时候,先把这层节点的右子入栈,再把左子入栈;如果下一层需要逆序,先把这层节点的左子入栈,再把右子入栈。
比如最初zigZag = true(第二层需要逆序),在遍历第一层(根节点3)的时候,先把左子9入栈,再把右子20入栈,那么最后出栈时候得到的第二层遍历序列为[20,9];然后zigZag=false(第三层不需要逆序),在遍历第二层的时候,先遍历20,将20右子入栈,然后将20的右子7放入nextLevel,再把左子15放入nextLevel,那么第三层出栈时实际得到[15,7]。
在这里有一点要注意,为什么不需要逆序的时候仍然需要用到栈呢?因为虽然当前层不需要逆序,但是当前层的上一层遍历的时候是逆序遍历的,所以仍然需要借助栈。比如如果我们把上述的树添加一个节点变成如下图所示的树:
遍历第三层应该得到[4,15,7],但是遍历第二层的顺序是20,9,所以20的孩子们还是要压到栈底,才能保证它们弹出来的时候在9的左子4的后面。
代码如下:
上述代码中46行的栈tmp是用来保存nextLevel栈的空间的,否则虽然把nextLevel栈赋值给currLevel了,但是当nextLevel清空的时候,这部分内存也会被清空,所以要把nextLevel中的元素放置到另一块内存里面。
栈的构造函数中不能直接把栈初始化成为另外一个栈,关于把一个栈赋值给另外一个栈的方法有很多,可以参见这里:http://stackoverflow.com/questions/7919836/how-do-i-copy-a-stack-in-java
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] ]
题解:首先设置一个变量zigZag表示在遍历下一层的时候,是否需要逆序,zigZag为true,表示下一层需要逆序,否则下一层不需要逆序。如果不需要逆序,那么在生成nextLevel的时候,先把这层节点的右子入栈,再把左子入栈;如果下一层需要逆序,先把这层节点的左子入栈,再把右子入栈。
比如最初zigZag = true(第二层需要逆序),在遍历第一层(根节点3)的时候,先把左子9入栈,再把右子20入栈,那么最后出栈时候得到的第二层遍历序列为[20,9];然后zigZag=false(第三层不需要逆序),在遍历第二层的时候,先遍历20,将20右子入栈,然后将20的右子7放入nextLevel,再把左子15放入nextLevel,那么第三层出栈时实际得到[15,7]。
在这里有一点要注意,为什么不需要逆序的时候仍然需要用到栈呢?因为虽然当前层不需要逆序,但是当前层的上一层遍历的时候是逆序遍历的,所以仍然需要借助栈。比如如果我们把上述的树添加一个节点变成如下图所示的树:
3 / \ 9 20 / / \ 4 15 7
遍历第三层应该得到[4,15,7],但是遍历第二层的顺序是20,9,所以20的孩子们还是要压到栈底,才能保证它们弹出来的时候在9的左子4的后面。
代码如下:
/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public List<List<Integer>> zigzagLevelOrder(TreeNode root) { List<List<Integer>> answer = new ArrayList<List<Integer>>(); if(root == null) return answer; Stack<TreeNode> currLevel = new Stack<TreeNode>(); Stack<TreeNode> nextLevel = new Stack<TreeNode>(); boolean zigZag = true; currLevel.push(root); while(!currLevel.isEmpty()){ ArrayList<Integer> result = new ArrayList<Integer>(); while(!currLevel.isEmpty()){ TreeNode node = currLevel.pop(); result.add(node.val); if(!zigZag){ if(node.right != null) nextLevel.push(node.right); if(node.left != null) nextLevel.push(node.left); } else { if(node.left != null) nextLevel.push(node.left); if(node.right != null) nextLevel.push(node.right); } } zigZag = !zigZag; List<Integer> temp = new ArrayList<Integer>(result); answer.add(temp); result.clear(); Stack<TreeNode> tmp = new Stack<TreeNode>(); tmp.addAll(nextLevel); currLevel = tmp; nextLevel.clear(); } return answer; } }
上述代码中46行的栈tmp是用来保存nextLevel栈的空间的,否则虽然把nextLevel栈赋值给currLevel了,但是当nextLevel清空的时候,这部分内存也会被清空,所以要把nextLevel中的元素放置到另一块内存里面。
栈的构造函数中不能直接把栈初始化成为另外一个栈,关于把一个栈赋值给另外一个栈的方法有很多,可以参见这里:http://stackoverflow.com/questions/7919836/how-do-i-copy-a-stack-in-java
相关文章推荐
- LeetCode 103 Binary Tree Zigzag Level Order Traversal
- 4.2 leetcode -2 binary-tree-zigzag-level-order-traversal
- [LeetCode]题解(python):103-Binary Tree Zigzag Level Order Traversal
- LeetCode103 Binary Tree Zigzag Level Order Traversal
- Leetcode 103 ,Binary Tree Zigzag Level Order Traversal(二叉树Z形分层遍历)
- LeetCode[Tree]: Binary Tree Zigzag Level Order Traversal
- [leetcode]Binary Tree Zigzag Level Order Traversal
- [Leetcode] Binary Tree Zigzag Level Order Traversal (Java)
- leetcode - Binary Tree Zigzag Level Order Traversal
- LeetCode Binary Tree Zigzag Level Order Traversal
- [LeetCode]103 Binary Tree Zigzag Level Order Traversal
- LeetCode:Binary Tree Zigzag Level Order Traversal
- Leetcode 树 Binary Tree Zigzag Level Order Traversal
- [Leetcode]Binary Tree Zigzag Level Order Traversal
- leetcode_103 Binary Tree Zigzag Level Order Traversal
- leetcode — binary-tree-zigzag-level-order-traversal
- LeetCode题解: Binary Tree Zigzag Level Order Traversal
- **(leetcode) Binary Tree Zigzag Level Order Traversal (tree)
- LeetCode:Binary Tree Zigzag Level Order Traversal
- leetcode[103]:Binary Tree Zigzag Level Order Traversal