看到有的博客用使用C++寫的,可是沒有java版本的,因此在這裏作一個補充。java
import baseclass.TreeNode; import javafx.util.Pair; import java.util.*; /** * 垂直遍歷二叉樹 */ public class straightTree { public static void main(String[] args){
//這裏的TreeNode是本身定義的一個樹節點的類 TreeNode head = new TreeNode(1); TreeNode node1 = new TreeNode(2); // TreeNode node2 = new TreeNode(3); head.left = node1; // head.right = node2;
//queue用於存放相同「數值」(後面會將是什麼東西)和TreeNode,就是平時的層次遍歷 Queue<Pair<Integer,TreeNode>> queue = new LinkedList<>();
//set用來順序存放「數值」,方便後面的遍歷 Set<Integer> set = new TreeSet<>();
//key是「數值」,value是TreeNode Pair pair = new Pair(0,head); queue.offer(pair);
//map用來存放相同「數值」,的全部對應的TreeNode Map<Integer, List<TreeNode>> map = new HashMap<>();
//這裏就是存放結果啦 List<List<TreeNode>> res = new ArrayList<>();
//層次遍歷 while(!queue.isEmpty()){ Pair<Integer,TreeNode> tempPair = queue.peek(); int key = tempPair.getKey(); TreeNode value = tempPair.getValue(); queue.poll(); set.add(key); List<TreeNode> tempList = map.getOrDefault(key,new ArrayList<TreeNode>()); tempList.add(value); map.put(key,tempList); if(value.left!=null)queue.offer(new Pair<>(key-1,value.left)); if(value.right!=null) queue.offer((new Pair<>(key+1,value.right))); } for(int i:set){ res.add(map.get(i)); } for(List<TreeNode> node:res){ System.out.println(node.get(0).val); } } }最後將一下思路:首先將根節點的「數值」置爲0,左節點爲-1,右節點爲+1,以此類推,將這些數值相同的節點統一放在map的value裏面,而後之因此還用用到一個set是由於map是根據key的hash值存儲的,因此直接遍歷key確定不是天然順序,因此就加了一個TreeSet,遍歷後放到res中就是最後的結果了!!!