来未来面试真题:根据树形表输出树形结构

news2024/11/15 11:36:48

根据以下所给代码补充完printNode方法,要求输出如下形式的树形结构

package com.ting.sort;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class Menu {
    static class Node{
        Integer id;
        Integer parentId;
        String name;
        Node(Integer id,Integer parentId,String name){
            this.id=id;
            this.parentId=parentId;
            this.name=name;
        }
    }

    public static void main(String[] args) {
        ArrayList<Node> nodeArrayList = new ArrayList<>();
        nodeArrayList.add(new Node(1,0,"AA"));
        nodeArrayList.add(new Node(2,1,"BB"));
        nodeArrayList.add(new Node(3,1,"CC"));
        nodeArrayList.add(new Node(4,2,"DD"));
        nodeArrayList.add(new Node(5,1,"EE"));
        nodeArrayList.add(new Node(6,3,"FF"));
        nodeArrayList.add(new Node(7,0,"EE"));
        printNode(nodeArrayList);
    }
    //在此补充代码
    private static void printNode(ArrayList<Node> nodeArrayList) {

    }
}

 分析

输出

0的儿子有1、7,1的儿子有2、3、5,2的儿子有4,3的儿子有6,4没儿子,5没儿子,6没儿子,7没儿子。显然是用递归的方法输出。根据父亲找儿子,再遍历儿子,找儿子的儿子....所以只需要把最小的父亲传入。

收集父亲的儿子们 

那首先就要计算出父亲以及它的儿子们。最好是这种形式{0=[1, 7], 1=[2, 3, 5], 2=[4], 3=[6]}。以父亲作为key,儿子列表为value。用hashmap是最好的选择,遍历nodeArrayList,若该父亲(key)不存在则new ArrayList<>()作为value加入hashmap;存在则获取原有的value(list),在此基础上add(node.id)。

        HashMap<Integer, List<Integer>> hashMap = new HashMap<>();
        for (Node node : nodeArrayList) {
            if(hashMap.get(node.parentId)==null){
                ArrayList<Integer> list = new ArrayList<>();
                list.add(node.id);
                hashMap.put(node.parentId,list);
            }else {
                List<Integer> integerList = hashMap.get(node.parentId);
                integerList.add(node.id);
                hashMap.put(node.parentId,integerList);
            }
        }

代码很简单 但写起来复杂吧。上面那些只需要用一行代码便可以解决

释意:若以node.parentId为key的entry存在,则在其value基础上add,若不存在则new一个新ArrayList再add。

        HashMap<Integer, List<Integer>> hashMap = new HashMap<>();
        for (Node node : nodeArrayList) {
            hashMap.computeIfAbsent(node.parentId,k->new ArrayList<>()).add(node.id);
        }
保证有序

但是hashmap是无序的,只是恰好 nodeArrayList 的parentId出现的顺序都是有序的,那么就需要先把最小的父亲找出来,但是初值应该赋什么呢?不好确定,太大效率低,太小不确定有没有比他更小的。所以直接赋值为nodeArrayList第一个节点的parentId。

//        最小的父亲初值为第一个节点的父亲
        Integer minParentId=nodeArrayList.get(0).parentId;
//        遍历 找到最小父亲
        for (Node node : nodeArrayList) {
            if(node.parentId<minParentId){
                minParentId=node.parentId;
            }
        }
        System.out.println(minParentId+"最小的父亲");
递归

拿到父亲和儿子了,也拿到了最小的父亲,接下来就是遍历输出了。 先输出父亲,再根据父亲查询其儿子也就是根据hashmap中的key找到value,若没有儿子直接返回,结束递归。有则遍历儿子,输出空格,递归调用该方法,但count+1,因为每递归一次说明是儿子。第一次调用该方法应为

method(hashMap,minParentId,0);
   private static void method(HashMap<Integer,List<Integer>> hashMap,Integer queryId,int count){
        System.out.println(queryId);
        List<Integer> ids = hashMap.get(queryId);
        if(ids==null){
            return;
        }else if (ids.size()>0&&ids!=null){
            for (Integer id : ids) {
                printSp(count);
                method(hashMap,id,count+1 );
            }
        }
    }
    private static void printSp(int count){
        for (int i=0;i<count;i++)
            System.out.print("  ");
    }

完整代码

package com.ting.sort;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class Menu {
    static class Node{
        Integer id;
        Integer parentId;
        String name;
        Node(Integer id,Integer parentId,String name){
            this.id=id;
            this.parentId=parentId;
            this.name=name;
        }
    }

    public static void main(String[] args) {
        ArrayList<Node> nodeArrayList = new ArrayList<>();
        nodeArrayList.add(new Node(1,0,"AA"));
        nodeArrayList.add(new Node(2,1,"BB"));
        nodeArrayList.add(new Node(3,1,"CC"));
        nodeArrayList.add(new Node(4,2,"DD"));
        nodeArrayList.add(new Node(5,1,"EE"));
        nodeArrayList.add(new Node(6,3,"FF"));
        nodeArrayList.add(new Node(7,0,"EE"));
        printNode(nodeArrayList);
    }
    private static void printNode(ArrayList<Node> nodeArrayList) {
        //todo
//        最小的父亲初值为第一个节点的父亲
        Integer minParentId=nodeArrayList.get(0).parentId;
//        遍历 找到最小父亲
        for (Node node : nodeArrayList) {
            if(node.parentId<minParentId){
                minParentId=node.parentId;
            }
        }
        System.out.println(minParentId+"最小的父亲");
//        将父亲id和出现次数存入hashmap
        HashMap<Integer, List<Integer>> hashMap = new HashMap<>();
        for (Node node : nodeArrayList) {
            hashMap.computeIfAbsent(node.parentId,k->new ArrayList<>()).add(node.id);
        }
        System.out.println(hashMap);
        method(hashMap,minParentId,0);
    }
    private static void method(HashMap<Integer,List<Integer>> hashMap,Integer queryId,int count){
        System.out.println(queryId);
        List<Integer> ids = hashMap.get(queryId);
        if(ids==null){
            return;
        }else if (ids.size()>0&&ids!=null){
            for (Integer id : ids) {
                printSp(count);
                method(hashMap,id,count+1 );
            }
        }
    }
    private static void printSp(int count){
        for (int i=0;i<count;i++)
            System.out.print("  ");
    }
}

 0可以在输出前判断去掉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1967426.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【PyTorch】多对象分割项目

对象分割任务的目标是找到图像中目标对象的边界。实际应用例如自动驾驶汽车和医学成像分析。这里将使用PyTorch开发一个深度学习模型来完成多对象分割任务。多对象分割的主要目标是自动勾勒出图像中多个目标对象的边界。 对象的边界通常由与图像大小相同的分割掩码定义&#xf…

【MySQL进阶】事务隔离级别 MVCC

目录 MySQL事务隔离级别 1. 读未提交&#xff08;Read Uncommitted&#xff09; 2. 读已提交&#xff08;Read Committed&#xff09; 3. 可重复读&#xff08;Repeatable Read&#xff09;(默认隔离级别) 4. 串行化&#xff08;Serializable&#xff09; 表格总结 MVCC …

C++栈和队列(容器适配器)

目录 1.什么是适配器&#xff1f; 2.栈(stack) 3.队列(queue) 4.双端队列(deque) 5.优先级队列(priority_queue) 1.什么是仿函数&#xff1f; 2.仿函数有什么用&#xff1f; 3.优先级队列(priority_queue) 1.什么是适配器&#xff1f; 我们之前实现栈和队列&#xff0…

QTCreate中使用git进行代码的备份

一开始使用QTCreate设计UI时&#xff0c;都是手动保存&#xff0c;后面觉得应该升级一下自己的技术栈&#xff0c;把git工具学了一些&#xff0c;摸索两天。首先&#xff0c;git是一个版本控制工具&#xff0c;正常开发需要一个master和一个你自己需要的分支&#xff0c;在分支…

批量下载 B 站 视频的工具 downkyi

批量下载 B 站 视频的工具 downkyi 亲测好用 图片&#xff1a; 下载地址&#xff1a; https://github.com/leiurayer/downkyi

SQL Server Profiler 只查看当前操作的语句

1.打开Sql Server Manage Studio&#xff0c;登录->工具->SQL Server Profiler->链接 点击事件选择 点击列筛选器 点击spid 输入对应的spid 如果不知道你的spid是多少的话&#xff0c;你可以先不筛选&#xff0c;直接运行&#xff0c;然后开启跟踪再运行一个独特的…

【项目管理】项目经理管理表单(及全套资料)

PM项目管理模板 甘特图 OKR周报 团队任务 工作总结

有没有比较好用的家用洗地机推荐?一文搞懂洗地机哪种牌子好

如今洗地机在我们家庭清洁中&#xff0c;已经很常见了&#xff0c;它可以让我们快速的完成地面清洁的工作&#xff0c;无需我们手动去清洗滚布&#xff0c;大大的节省了我们清洁时间&#xff0c;而且清洁效果也更加到位。但是目前市面上的洗地机型号多到让人眼花缭乱&#xff0…

Android开发之组件化

#来自ウルトラマンゼロ&#xff08;哉阿斯&#xff09; 1 简介 通俗来讲&#xff0c;将一个功能完整的 App 或模块拆分成多个子模块, 每个子模块可以独立编译和运行。也可以任意组合成另一个新的 App 或模块, 每个模块即不相互依赖但又可以相互交互, 遇到某些特殊情况甚至可以升…

RN 开发环境搭建(Windows For Android)

传送门&#xff1a;官网的搭建步骤&#xff08;英文&#xff09; 传送门&#xff1a;官网的搭建步骤&#xff08;中文&#xff09; 注&#xff1a;教程写于2022年11月21日&#xff0c;当时也是根据官网步骤一步步操作的。现在时隔2年&#xff0c;最新的 RN 版本&#xff08;V…

在现有的vue3项目中 配置electron

Vue项目已创建&#xff0c;在此基础上安装electron 配置步骤&#xff1a; 装依赖 yarn install装electron安装concurrently ( 一条命令实现同时启动vue项目和electron)安装nodemon (实现热更新) 一、配置途中遇到的问题&#xff1a; 1. 安装 yarn add electron -D 一直卡在这…

连锁企业组网的优化解决方案

对于连锁企业来说&#xff0c;建立高效的网络组网很重要&#xff0c;因为它直接影响到各分支机构之间的信息共享、管理效率和业务流程的顺畅。一个理想的解决方案需要从多个角度入手&#xff0c;以确保网络的稳定性、安全性和可扩展性。 首先&#xff0c;需要选择合适的网络拓扑…

stm32番外-----0.96寸OLED播放电影《你的名字》

目录 前言 OLED播放视频 1.简述 2.现象 3.电路连接图​编辑 4.项目主要文件 5.代码 6.注意事项 前言 刚好前面学习了USART串口通信&#xff0c;本期咱们来玩个有意思的&#xff0c;就是去通过USART实现视频的播放&#xff0c;本期内容程序是来自江协科技的&#xf…

Getty 携手英伟达升级商业文生图 AI 模型;苹果新专利探索「心跳」解锁 iPhone 丨 RTE 开发者日报

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

中科院4区救命神刊!主打不让任何一个人延毕~沾边可录!

【SciencePub学术】本期&#xff0c;小编给大家推荐一本JCR2区中科院4区的“救命神刊”&#xff01;征稿领域可谓是相当广泛&#xff0c;且国人友好&#xff0c;计算机领域的学者可以考虑一下这本期刊&#xff01; 期刊解析 KNOWLEDGE AND INFORMATION SYSTEMS 《知识与信息系统…

计算机毕业设计选题推荐-学院教学工作量统计系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

Unity后处理(Post-processing)

Unity post-processing 就像是对图片采用滤镜一样&#xff08;如下图对比&#xff09;对当前场景显示做一定的显示处理&#xff0c;使得场景更漂亮、有趣或者有型。 视觉风格与视觉保真 游戏场景后处理能够达到所需的视觉风格&#xff08;visual style&#xff09;同时也保证视…

【Stack和Queue模拟实现】

Stack和Queue模拟实现 小杨 在模拟实现之前&#xff0c;有必要介绍一下什么是容器适配器 容器适配器 适配器是一种设计模式&#xff0c;该种模式是将一个类的接口转换成客户希望的另一个接口。 虽然stack和queue中也可以存放元素&#xff0c;但在STL中并没有将其划分在容器的…

星环科技推出革新性智能业务分析洞察平台——无涯·问数

5月30-31日&#xff0c;2024向星力未来数据技术峰会期间&#xff0c;星环科技重磅发布一款新产品无涯问数——智能业务分析洞察平台。该产品旨在解决传统BI在数据获取、使用门槛和效率方面的挑战&#xff0c;为决策者和业务人员带来前所未有的数据分析体验。 无涯问数的问世&am…

丰田生产方式:拒绝表面效率!!!

在需要的时间&#xff0c;一件一件地生产所需要的东西&#xff0c;就可以避免“过量生产的浪费”。但是&#xff0c;这时你必须知道“需要的时间”是在什么时候。于是&#xff0c;“单位时间”的意义就很重要了。 所谓“单位时间”&#xff0c;就是指制造一件产品的时间。这必须…