自定义树形容器

该文章介绍了一个使用HashMap实现的自定义树结构,包括添加元素、获取父结点、子结点、兄弟结点、祖先结点和子孙结点的方法。通过递归处理,实现了对树形结构的遍历和操作。
摘要由CSDN通过智能技术生成

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

public class MyTree<E> {

    private Map<E,E> map=new HashMap<>();
    private Map<E,List<E>> map2=new HashMap<>();
    /**
     * 向容器中添加元素
     * @param parent
     * @param item
     */
    public void add(E parent,E item){
        //先完成在树中的单结点映射
        this.map.put(item,parent);
        //完成多结点之间的映射
        List<E> list=this.map2.get(parent); //先取出map2中的list
        //判断list是否为空
        if (list==null){
            list=new ArrayList<>(); //说明没有list需要创建一个list
            this.map2.put(parent,list); //将父结点对应子结点的容器
        }
        list.add(item); //将子结点添加到list容器中
    }

    /**
     * 获取当前结点的父结点
     * @return
     */
    public E getParent(E item){
        return this.map.get(item);
    }

    /**
     * 获取当前结点的子结点
     * @return
     */
    public List<E> getChild(E item){
        return this.map2.get(item);
    }

    /**
     * 获取当前结点的兄弟结点
     * @return
     */
    public List<E> getBrother(E item){
        //获取当前结点的父结点
       E parent=this.getParent(item);
       //获取当前父结点的所有子结点
       List<E> list=this.getChild(parent);
       List<E> brother=new ArrayList<>();
       if (list!=null){
           brother.addAll(list);
           brother.remove(item);
       }
        return brother;
    }

    /**
     * 获取当前结点的祖先结点
     * @return
     */
    public List<E> getForefathers(E item){
        //获取当前结点的父结点
        E parent=this.getParent(item);
        //结束递归的边界条件
        if (parent==null){
            //当最后一次执行的时候this.getForefathers(parent);返回的是new ArrayList<>();创建了一个list容器用来存放父结点
            return new ArrayList<>();
        }
        //使用递归接着调用父结点
        List<E> list=this.getForefathers(parent);
        //将所有父结点添加到list容器中
        list.add(parent);
        return list;
    }

    /**
     * 获取当前结点的子孙结点
     * @param item
     * @return
     */
    public List<E> getGrandChildren(E item){
        //存放所有子孙结点中的元素
        List<E> list=new ArrayList<>();
        //获取当前结点的子结点
        List<E> child=this.getChild(item);
        //递归的边界条件
        if (child==null){
            return list; //如果当前的子结点为空返回list容器
        }
        //遍历子结点
        for (int i=1;i<child.size();i++){
            //获取结点中的元素
            E ele=child.get(i);
            //获取子结点中每个子结点的子结点(递归)
            List<E> temp=this.getGrandChildren(ele);
            //将每个子结点添加到list容器中
            list.add(ele);
            //将子结点的子结点添加到容器中
            list.addAll(temp);
        }
        return list;
    }

学习目标:

学习java数据结构  自定义树形容器


学习内容:

创建一个自定义树形容器

理解递归

理解HashMap

理解树形容器的存储原理


学习时间:

2023 6 月 4 日上午


学习产出:

就这个

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值