zoukankan      html  css  js  c++  java
  • 垂直遍历二叉树

    参考链接: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;
            }
        }
    
    }
  • 相关阅读:
    点对点风格软件架构模式
    《XXX重大技术需求征集系统》的可用性和可修改性战术分析
    淘宝网应用场景分析
    《架构漫谈》读后感
    《软件需求模式》阅读笔记06
    hdfs会出现的一些问题
    经常使用的架构模式之一——客户端-服务器模式
    阅读《大型网站技术架构》
    以《淘宝网》为例分析质量属性
    架构漫谈读后感
  • 原文地址:https://www.cnblogs.com/LoganChen/p/13063487.html
Copyright © 2011-2022 走看看