参考链接:https://blog.csdn.net/weixin_43092168/article/details/93176238
题目:给定二叉树,按垂序遍历返回其节点值。
对位于(X,Y)的每个结点而言,其左右子节点分别位于(X-1,Y-1)和(X+1,Y-1)。
把一条垂线从X=-infinity移动到X=+infinity,每当该垂线与节点接触时,我们按从上到下的顺序报告节点的值(Y坐标递减)。
如果两个节点位置相同,则首先报告的节点值较小。
按X坐标顺序返回非空报告的列表。每个报告都有一个节点值列表。
链接:https://leetcode-cn.com/problems/vertical-order-traversal-of-a-binary-tree
官方实例
输入:[3,9,20,null,null,15,7]
输出:[[9],[3,15],[20],[7]]
解释:在不丧失其普遍性的情况下,我们可以假设根节点位于(0,0)
然后,值为9的节点出现在(-1,-1)
值为3和15的节点分别出现在(0,0)和(0,-2)
值为20的节点出现在(1,-1)
值为7的节点出现在(2,-2)
import java.util.*; /** * 垂直遍历二叉树 */ public class Solution { HashMap<Integer,List<Entry>> map = new HashMap<>(); public List<List<Integer>> verticalTraversal(TreeNode root){ List<List<Integer>> re = new ArrayList<>(); iterateTreeNode(root,0,0); Object[] objects = map.keySet().toArray(); Arrays.sort(objects); for(Object key:objects){ List<Entry> list = map.get(key); list.sort(new Comparator<Entry>() { @Override public int compare(Entry o1, Entry o2) { if(o1.y != o2.y){ return Integer.compare(o1.y,o2.y); }else{ return Integer.compare(o1.val,o2.val); } } }); List<Integer> integerList = new ArrayList<>(); for(Entry entry:list){ integerList.add(entry.val); } re.add(integerList); } return re; } private void iterateTreeNode(TreeNode node,int x, int y){ if(node == null){ return; } if(map.containsKey(x)){ map.get(x).add(new Entry(node.val,y)); }else{ map.put(x,new java.util.ArrayList<>(Arrays.asList(new Entry(node.val,y)))); } //递归左子节点 iterateTreeNode(node.left, x-1,y-1); //递归右子节点 iterateTreeNode(node.right,x+1,y-1); } //定义的内部类,用来辅助我们保存信息用的。 class Entry{ int val; int y; public Entry(int val, int y){ this.val = val; this.y = y; } } }