題目:
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.
這道題的目的是把樹(shù)按列輸出,以root為其實(shí)點(diǎn)按層遍歷,節(jié)點(diǎn)的左邊列標(biāo)-1,節(jié)點(diǎn)的右邊列標(biāo)+1。然后為了找到起始點(diǎn)好遍歷map的keyset,我們用 left_margin 來(lái)記錄起始位置。
public List<List<Integer>> verticalOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
Map<Integer, List<Integer>> map = new HashMap();
int left_margin = 0;
Queue<TreeNodePlus> queue = new LinkedList();
if(root != null) addToQueue(queue, root, 0);
for(TreeNodePlus nodeplus = queue.poll(); nodeplus != null; nodeplus = queue.poll()){
List<Integer> list = map.get(nodeplus.colomn);
if(list == null){
list = new ArrayList();
list.add(nodeplus.node.val);
map.put(nodeplus.colomn, list);
} else list.add(nodeplus.node.val);
if(nodeplus.node.left != null){
int temp = nodeplus.colomn - 1;
left_margin = Integer.min(left_margin, temp);
addToQueue(queue, nodeplus.node.left, temp);
}
if(nodeplus.node.right != null) addToQueue(queue, nodeplus.node.right, nodeplus.colomn + 1);
}
if(!map.isEmpty()) for(int i = 0; i < map.size() ; ++i) res.add(map.get(i + left_margin));
return res;
}
public void addToQueue(Queue<TreeNodePlus> queue, TreeNode node, int colomn){
TreeNodePlus plus = new TreeNodePlus(node, colomn);
queue.offer(plus);
}
public class TreeNodePlus {
TreeNode node;
int colomn;
public TreeNodePlus(TreeNode node, int colomn){
this.node = node;
this.colomn = colomn;
}
}