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 日上午
学习产出:
就这个