103. Binary Tree Zigzag Level Order Traversal
2017-10-23 20:00
453 查看
原题:
点击打开链接
层次遍历二叉树,但是要求按锯齿状输出(类似于蛇形)。
思考过程:
一开始想用双向队列。Deque<TreeNode> deque = new ArrayDeque();后来发现用栈就可以实现。栈和队列顺序相反,前者先进后出,后者先进先出。有点绕,但是最终还是解决了。
解题思路:
每层创建一个栈用于储存下一层(是按下一层输出顺序的倒序储存)。这里关键在于:
如果本行是正序输出的,那么下一行按先左子节点后右子节点的顺序将下一行节点添加到栈,这样下一行出栈就按照倒序输出了;
如果本行是按倒序倒序输出的,那就按先右子节点后左子节点的顺序将下一行节点添加到栈,这样下一行就按正序输出了。
结果代码:
List<List<Integer>> ret = new ArrayList<>();
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
if (root == null) return ret;
Stack<TreeNode> stack = new Stack<>();
stack.add(root);
recursive(stack,false);
return ret;
}
public void recursive(Stack<TreeNode> stack,boolean reverse){//reverse表示这个栈里元素出栈后形成的是否翻转过,如果是,就是false
if (stack.isEmpty()) return;
Stack<TreeNode> newStack = new Stack<>();
List<Integer> subRet = new ArrayList<>();
while (!stack.isEmpty()){
TreeNode treeNode = stack.pop();
subRet.add(treeNode.val);
TreeNode left = treeNode.left;
TreeNode right = treeNode.right;
if (!reverse) {//如果栈里元素输出后是正序,下一行元素按先左后右添加子节点到新的栈
if (left != null) newStack.add(left);
if (right != null) newStack.add(right);
}
else {//如果栈里元素输出后是倒序,按先有后左顺序添加子节点到新的栈
if (right != null) newStack.add(right);
if (left != null) newStack.add(left);
}
}
ret.add(subRet);
recursive(newStack,!reverse);
}
点击打开链接
层次遍历二叉树,但是要求按锯齿状输出(类似于蛇形)。
思考过程:
一开始想用双向队列。Deque<TreeNode> deque = new ArrayDeque();后来发现用栈就可以实现。栈和队列顺序相反,前者先进后出,后者先进先出。有点绕,但是最终还是解决了。
解题思路:
每层创建一个栈用于储存下一层(是按下一层输出顺序的倒序储存)。这里关键在于:
如果本行是正序输出的,那么下一行按先左子节点后右子节点的顺序将下一行节点添加到栈,这样下一行出栈就按照倒序输出了;
如果本行是按倒序倒序输出的,那就按先右子节点后左子节点的顺序将下一行节点添加到栈,这样下一行就按正序输出了。
结果代码:
List<List<Integer>> ret = new ArrayList<>();
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
if (root == null) return ret;
Stack<TreeNode> stack = new Stack<>();
stack.add(root);
recursive(stack,false);
return ret;
}
public void recursive(Stack<TreeNode> stack,boolean reverse){//reverse表示这个栈里元素出栈后形成的是否翻转过,如果是,就是false
if (stack.isEmpty()) return;
Stack<TreeNode> newStack = new Stack<>();
List<Integer> subRet = new ArrayList<>();
while (!stack.isEmpty()){
TreeNode treeNode = stack.pop();
subRet.add(treeNode.val);
TreeNode left = treeNode.left;
TreeNode right = treeNode.right;
if (!reverse) {//如果栈里元素输出后是正序,下一行元素按先左后右添加子节点到新的栈
if (left != null) newStack.add(left);
if (right != null) newStack.add(right);
}
else {//如果栈里元素输出后是倒序,按先有后左顺序添加子节点到新的栈
if (right != null) newStack.add(right);
if (left != null) newStack.add(left);
}
}
ret.add(subRet);
recursive(newStack,!reverse);
}
相关文章推荐
- 103. Binary Tree Zigzag Level Order Traversal
- 103. Binary Tree Zigzag Level Order Traversal
- 103. Binary Tree Zigzag Level Order Traversal
- 103. Binary Tree Zigzag Level Order Traversal
- 103. Binary Tree Zigzag Level Order Traversal
- 103. Binary Tree Zigzag Level Order Traversal
- 103. Binary Tree Zigzag Level Order Traversal LeetCode
- 103. Binary Tree Zigzag Level Order Traversal
- 103. Binary Tree Zigzag Level Order Traversal
- 103. Binary Tree Zigzag Level Order Traversal
- 103. Binary Tree Zigzag Level Order Traversal
- 103. Binary Tree Zigzag Level Order Traversal
- 103. Binary Tree Zigzag Level Order Traversal
- 103. Binary Tree Zigzag Level Order Traversal
- 103. Binary Tree Zigzag Level Order Traversal (Tree, Queue; BFS)
- (M)BFS:103. Binary Tree Zigzag Level Order Traversal
- leecode 解题总结:103. Binary Tree Zigzag Level Order Traversal
- C++详解Leetcode:103. Binary Tree Zigzag Level Order Traversal
- 103. Binary Tree Zigzag Level Order Traversal
- 103. Binary Tree Zigzag Level Order Traversal