Given a binary tree, return the vertical order traversal of its nodes’ values. (ie, from top to bottom, column by column).
If two nodes are in the same row and column, the order should be from left to right.
Examples 1:
Input: [3,9,20,null,null,15,7]
3
/\
/ \
9 20
/\
/ \
15 7
Output:
[
[9],
[3,15],
[20],
[7]
]
Examples 2:
Input: [3,9,8,4,0,1,7]
3
/\
/ \
9 8
/\ /\
/ \/ \
4 01 7
Output:
[
[4],
[9],
[3,0,1],
[8],
[7]
]
利用BFS,遍历所有节点。同时每个节点上附带上当前的level信息。
根节点为0,左孩子为-1,右孩子为1.
左孩子的level = 父节点的level - 1 右孩子的level = 父节点level + 1
同时,遍历出来的节点,存入一个TreeMap<level , List>中,以level排序。 对应的value是list,存入相同level的节点的值。
class Solution {
public List<List<Integer>> verticalOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
if (root == null) {
return result;
}
TreeMap<Integer, List<Integer>> bst = new TreeMap<>();
Queue<Node> queue = new LinkedList<>();
queue.add(new Node(root, 0));
while (!queue.isEmpty()) {
Node node = queue.poll();
if (!bst.containsKey(node._level)) {
bst.put(node._level, new ArrayList<>());
}
bst.get(node._level).add(node._treeNode.val);
if (node._treeNode.left != null) {
queue.add(new Node(node._treeNode.left, node._level - 1));
}
if (node._treeNode.right != null) {
queue.add(new Node(node._treeNode.right, node._level + 1));
}
}
for (int k : bst.keySet()) {
result.add(bst.get(k));
}
return result;
}
private class Node {
TreeNode _treeNode;
int _level;
public Node(TreeNode treeNode, int level) {
_treeNode = treeNode;
_level = level;
}
}
}