给定一个二叉树,返回其结点 垂直方向(从上到下,逐列)遍历的值。
如果两个结点在同一行和列,那么顺序则为 从左到右。
示例:
思路:假设跟节点的位置是0,
跟节点左孩子的位置减1就是-1,右孩子的位置加1,
跟节点左孩子的右孩子位置就是0,-1+1=0,那么1,5节点就是同一个等级的。
源码:
package com.my.java.suanfa.ListNode;
public class MyListNode {
int val;
MyListNode left;
MyListNode right;
MyListNode(int val) {
this.val = val;
}
MyListNode(int val,MyListNode left,MyListNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
//垂直遍历二叉树,返回各个等级的列表
public static Map<Integer,List<MyListNode>> chuizhiTraversal(MyListNode root) {
if (root == null) {
return null;
}
//result 按照等级纬度,存储各个等级下的元素节点,跟节点初始化为0
HashMap<Integer,List<MyListNode>> result = new HashMap<>();
List<MyListNode> list = new ArrayList<>();
list.add(root);
result.put(0,list);
//queue采用层次遍历,先进先出
Queue<MyListNode> queue = new LinkedList<>();
queue.offer(root);
//nodeMap存储各个节点是第几等级,跟节点是0等级
HashMap<MyListNode,Integer> nodeMap = new HashMap<>();
nodeMap.put(root,0);
while (!queue.isEmpty()) {
MyListNode node = queue.poll();
int index = nodeMap.get(node);
if (node.left != null) {
//入栈,先进的会先出
queue.offer(node.left);
//左边节点的等级-1,此处index的值不能变
nodeMap.put(node.left,index-1);
//找到返回结果中这个等级的元素们,插入进去
List<MyListNode> leafList = result.get(index-1);
if (leafList == null) {
leafList = new ArrayList<>();
leafList.add(node.left);
result.put(index-1,leafList);
} else {
leafList.add(node.left);
}
}
if (node.right != null) {
queue.offer(node.right);
//右边节点的等级+1,此处index的值不能变
nodeMap.put(node.right,index+1);
List<MyListNode> leafList = result.get(index+1);
if (leafList == null) {
leafList = new ArrayList<>();
leafList.add(node.right);
result.put(index+1,leafList);
} else {
leafList.add(node.right);
}
}
}
return result;
}