垂直遍历二叉树

参考链接: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;
        }
    }

}
原文地址:https://www.cnblogs.com/LoganChen/p/13063487.html