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

根据以下所给代码补充完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可以在输出前判断去掉

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值