https://leetcode.com/problems/binary-tree-vertical-order-traversal/
这一题并不难。就是要找到最左边的那个节点有多么的左,最右边那个节点有多么的右。然后以最左边的那个节点作为index 0,然后结果的size就是最右边的节点到最左边的节点的横向距离。先通过dfs去求得上面的左右距离,然后根节点的index是他与最左边的节点的横向距离。譬如examples 1里,3的index就是1,因为最左边的那个节点9和他的横向距离就是只有1。然后再做bfs去把每个节点的值放进对应的index的List里面就好了。给出代码如下:
class Solution {
public List<List<Integer>> verticalOrder(TreeNode root) {
int[] minMax = new int[2];
traverseMinMax(root, minMax, 0);
int offset = -minMax[0];
int arrSize = minMax[1] - minMax[0];
ArrayList<List<Integer>> result = new ArrayList<>();
if (root == null) return result;
for (int i = 0; i <= arrSize; i++) {
result.add(new LinkedList<Integer>());
}
Queue<TreeNode> nodeQ = new LinkedList<TreeNode>();
Queue<Integer> indexQ = new LinkedList<Integer>();
nodeQ.add(root);
indexQ.add(offset);
while (!nodeQ.isEmpty()) {
TreeNode node = nodeQ.poll();
int idx = indexQ.poll();
result.get(idx).add(node.val);
if (node.left != null) {
indexQ.add(idx - 1);
nodeQ.add(node.left);
}
if (node.right != null) {
indexQ.add(idx + 1);
nodeQ.add(node.right);
}
}
return result;
}
public void traverseMinMax(TreeNode root, int[] minMax, int current) {
if (root == null) {
return;
}
minMax[0] = Math.min(current, minMax[0]);
minMax[1] = Math.max(current, minMax[1]);
traverseMinMax(root.left, minMax, current - 1);
traverseMinMax(root.right, minMax, current + 1);
}
}

被折叠的 条评论
为什么被折叠?



