二叉树垂直遍历 java_垂直遍历二叉树

题目:给定二叉树,按垂序遍历返回其节点值。

对位于(X,Y)的每个结点而言,其左右子节点分别位于(X-1,Y-1)和(X+1,Y-1)。

把一条垂线从X=-infinity移动到X=+infinity,每当该垂线与节点接触时,我们按从上到下的顺序报告节点的值(Y坐标递减)。

如果两个节点位置相同,则首先报告的节点值较小。

按X坐标顺序返回非空报告的列表。每个报告都有一个节点值列表。

官方实例

二叉树垂直遍历 java_垂直遍历二叉树_第1张图片

输入:[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 classSolution {

HashMap> map = new HashMap<>();public List>verticalTraversal(TreeNode root){

List> re = new ArrayList<>();

iterateTreeNode(root,0,0);

Object[] objects=map.keySet().toArray();

Arrays.sort(objects);for(Object key:objects){

List list =map.get(key);

list.sort(new Comparator() {

@Overridepublic intcompare(Entry o1, Entry o2) {if(o1.y !=o2.y){returnInteger.compare(o1.y,o2.y);

}else{returnInteger.compare(o1.val,o2.val);

}

}

});

List integerList = new ArrayList<>();for(Entry entry:list){

integerList.add(entry.val);

}

re.add(integerList);

}returnre;

}private void iterateTreeNode(TreeNode node,int x, inty){if(node == null){return;

}if(map.containsKey(x)){

map.get(x).add(newEntry(node.val,y));

}else{

map.put(x,new java.util.ArrayList<>(Arrays.asList(newEntry(node.val,y))));

}//递归左子节点

iterateTreeNode(node.left, x-1,y-1);//递归右子节点

iterateTreeNode(node.right,x+1,y-1);

}//定义的内部类,用来辅助我们保存信息用的。

classEntry{intval;inty;public Entry(int val, inty){this.val =val;this.y =y;

}

}

}

你可能感兴趣的:(二叉树垂直遍历,java)