LeetCode.314. Binary Tree Vertical Order Traversal
阿新 • • 發佈:2018-12-22
這道題讓我們豎直的遍歷樹,和按層遍歷非常相似。我第一次做的時候,使用的是遞迴的形式,發現順序會出錯。
因此還是要藉助按層遍歷的思路,將樹逐層的加入一個佇列,然後再取出來進行處理。
遍歷的時候,如果是左節點,就-1,如果是右節點就+1,這樣就記住了從左到右的層級順序。
我使用的是兩個列表來分別存 正數和0 的列表,和負數的列表。
class Solution {
public static class Pair {
public int level = 0;
public TreeNode treeNode;
public Pair (int l, TreeNode tn) {
level = l;
treeNode = tn;
}
}
public List<List<Integer>> verticalOrder(TreeNode root) {
List<List<Integer>> positive = new ArrayList<>();
List<List<Integer>> negative = new ArrayList<>();
if (root == null) {
return positive;
}
Queue<Pair> queue = new ArrayDeque<>();
queue.add(new Pair(0, root));
while (!queue.isEmpty()) {
int size = queue.size();
List<Integer> temp = new ArrayList<>();
for (int i = 0; i < size; i++) {
Pair pair = queue.poll();
if (pair.level >= 0) {
if (positive.size() <= pair.level) {
positive.add(new ArrayList<>());
}
positive.get(pair.level).add(pair.treeNode.val);
} else {
int index = Math.abs(pair.level) - 1;
if (negative.size() <= index) {
negative.add(new ArrayList<>());
}
negative.get(index).add(pair.treeNode.val);
}
temp.add(pair.treeNode.val);
if (pair.treeNode.left != null) {
queue.add(new Pair(pair.level - 1, pair.treeNode.left));
}
if (pair.treeNode.right != null) {
queue.add(new Pair(pair.level + 1, pair.treeNode.right));
}
}
}
for (List<Integer> list : negative) {
positive.add(0, list);
}
return positive;
}
}