1. 程式人生 > >LeetCode.314. Binary Tree Vertical Order Traversal

LeetCode.314. Binary Tree Vertical Order Traversal

這道題讓我們豎直的遍歷樹,和按層遍歷非常相似。我第一次做的時候,使用的是遞迴的形式,發現順序會出錯。
因此還是要藉助按層遍歷的思路,將樹逐層的加入一個佇列,然後再取出來進行處理。

遍歷的時候,如果是左節點,就-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; } }