package com.hyc.test.tree;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 类说明:基于树形结构实现存储容器
*
* @author hyc
* @version 1.0
* @date 2021/9/21 17:27
*/
public class MyTree<E> {
// 完成单节点与单节点的映射关系
private Map<E, E> m1 = new HashMap<>();
// 完成父节点和子节点的映射关系
private Map<E, List<E>> m2 = new HashMap<>();
/*
向容器中添加元素
*/
void add(E parent, E item) {
// 完成单节点的映射
m1.put(item, parent);
//完成多节点之间的映射
List<E> list = m2.get(parent);
if (list == null) {
list = new ArrayList<>();
m2.put(parent, list);
}
list.add(item);
}
//当前节点的父节点
public E getParent(E item) {
return m1.get(item);
}
/*
获取当前节点的子节点
*/
public List<E> getChildren(E item) {
return this.m2.get(item);
}
/*
获取当前节点的兄弟节点
*/
public List<E> getBrother(E item) {
E parent = this.getParent(item);
List<E> children = this.getChildren(parent);
ArrayList<E> brothers = new ArrayList<>();
if (children != null) {
brothers.addAll(children);
brothers.remove(item); // 移除当前节点,剩余的就是brother
}
return brothers;
}
/*
获取当前节点的祖先节点
*/
public List<E> getFathers(E item) {
E parent = this.getParent(item);
// 获取当前节点的父节点 采用递归调用!
if (parent == null) {
return new ArrayList<>();
}
List<E> list = this.getFathers(parent); // 递归 栈执行顺序,要搞清楚!
// 将所有获得的
list.add(parent);
return list;
}
/*
获取当前节点子孙节点
*/
public List<E> getGrandchildren(E item) {
List<E> list = new ArrayList<>();// 存放所有子孙节点的元素!
// 获取当前节点的子节点
List<E> children = this.getChildren(item);
// 结束递归的边界条件
if (children == null) {
return list;
}
//遍历
for (int i = 0; i < children.size(); i++) {
// 获取节点中的元素
E le = children.get(i);
List<E> temp = this.getGrandchildren(le);
list.add(le);
list.addAll(temp);
}
return list;
}
/**
* 测试方法main
*
* @param args
*/
public static void main(String[] args) {
MyTree<String > myTree = new MyTree<>();
myTree.add("root","人");
myTree.add("人","小河");
myTree.add("人","小名");
List<String> myTreeGrandchildren = myTree.getGrandchildren("人");
for (int i = 0; i < myTreeGrandchildren.size(); i++) {
System.out.println(myTreeGrandchildren.get(i));
}
}
}
基于树形结构实现存储容器
最新推荐文章于 2024-08-21 13:55:04 发布