您的位置:首页 > 其它

Binary Tree Zigzag Level Order Traversal ---LeetCode

2016-11-28 11:10 393 查看
https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/

解题思路:

这道题是层序遍历的变体,分奇偶层正序或逆序输出每层。

Binary Tree Level Order Traversal 这道题是每一个水平层都是从左至右的遍历,Binary Tree Level Order Traversal II 是将水平层从下至上的输出,而这道题是奇数层从左至右的遍历,偶数层从右至左的遍历,最后水平层从上至下的输出。

这里使用两个栈,通过判断奇偶层来决定节点入栈次序。

/**
* Definition for a binary tree node.
* 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>> result = new ArrayList<>();
List<Integer> list = new ArrayList<>();
Stack<TreeNode> curr = new Stack<>();
Stack<TreeNode> next = new Stack<>();

if (root == null) return result;
curr.push(root);
int level = 1;
while (!curr.isEmpty()) {
TreeNode node = curr.pop();
if (level % 2 != 0) {
if (node.left != null)
next.push(node.left);
if (node.right != null)
next.push(node.right);
} else {
if (node.right != null)
next.push(node.right);
if (node.left != null)
next.push(node.left);
}

list.add(node.val);
if (curr.isEmpty()) {
curr = next;
next = new Stack<>();
result.add(list);
list = new ArrayList<>();
level++;
}
}
return result;
}
}


从 discuss 里面找到了用标志位的写法,这个写法我自己更喜欢一些~

/**
* Definition for a binary tree node.
* 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>> result = new ArrayList<>();

if (root == null) return result;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
boolean level = true; int size = 1;

while (!queue.isEmpty()) {
List<Integer> list = new ArrayList<>();

for (int i=0; i<size; i++) {
root = queue.poll();

if (level)  list.add(root.val);
else        list.add(0, root.val);

if (root.left != null)
queue.offer(root.left);
if (root.right != null)
queue.offer(root.right);
}
result.add(list);
size = queue.size();
level = level ? false : true;
}
return result;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: