1.树形结构的介绍

* 树形结构简介
 * 树形结构是一种非线性结构,存储的是“一对多的”关系的数据元素的集合
 *
 * 树形结构的相关术语:
 * 节点(Node):使用树结构存储的每一个数据元素都被称为“节点”
 * 节点的度(Degree of Node):某个节点所拥有的子树的个数
 * 树的深度(Degree of Tree):树中节点的最大层数
 * 叶子节点(Leaf Node):度为0的节点,也叫终端节点
 * 分支节点(Branch Node):度不为0的节点,也叫非终端节点或内部节点
 * 孩子(child):也可称之为子树或子节点,表示当前节点下层的直接节点
 * 双亲(parent):也可称为父节点,表示当前节点的直接上层节点
 * 根节点(Root Node):没有双亲节点的节点,在树形结构中只有一个根节点
 * 祖先(Ancestor):当前节点上层的所有节点(当前节点的直接祖先节点)
 * 子孙(Descendent):当前节点下层的所有节点
 * 兄弟(Brother):同一双亲孩子
 *
 * 二叉树简介
 * 二叉树(Binary Tree)是树形结构的重要类型
 * 二叉树特点是每个节点最多只能有两颗子树,且有左右之分
 *
 * 二叉树分类
 * 满二叉树:除最后一层外,每一层上的所有节点都有两个子节点
 * 完全二叉树:除最后一层可能不满外,其他各层都达到该层节点的最大数,最后一层如果不满,该层节点全部靠左排
 *
 * 二叉树遍历方式
 * 前序遍历:根-左-右
 * 中序遍历:左-根-右
 * 后序遍历:左-右-根
 * 层序遍历:从上至下逐层遍历

2.树形结构容器类--递归方法的使用--this关键字的指向

package DataStructure_8;//树形结构容器类--递归方法的使用--this关键字的指向/*** 自定义树形结构容器:* 能够找到当前节点的父节点* 能够找到当前节点的子节点* 能够找到当前节点的兄弟节点* 能够找到当前节点的祖先节点* 能够找到当前节点的子孙节点**/import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** 基于树形结构实现元素存储的容器*/
//一个节点就是一个元素
public class Text5<E> {//子节点映射父节点private Map<E,E> aa=new HashMap<>();//父节点映射子节点private Map<E,List<E>> bb=new HashMap<>();//向容器中添加元素的方法private void add(E parent,E item){          //参数为父节点和子节点,每个节点就是一个元素//完成单节点之间的映射,子节点映射父节点this.aa.put(item,parent);//完成多节点之间的映射,父节点映射子节点List<E> list=this.bb.get(parent);//判断装载子节点的容器是否为空,为空则创建新list容器装载子节点if (list==null){list=new ArrayList<>();this.bb.put(parent,list);       //将新创建的list容器赋给父节点的value}list.add(item);     //为list容器添加子节点元素}//根据当前节点获取其父节点private E getParent(E item){return this.aa.get(item);}//获取当前节点的子节点private List<E> getChild(E item){return this.bb.get(item);}//获取当前节点的兄弟节点private List<E> getBrother(E item){//获取当前节点的父节点E parent=this.getParent(item);//获取当亲节点的子节点容器List<E> list=this.getChild(parent);//list容器中的子节点不能删除,否则子节点会被永久删除List<E> brother=new ArrayList<>();if (brother != null){           //新建ArrayList对象为[],不为nullbrother.addAll(list);brother.remove(item);}return brother;}//获取当前节点的祖先节点private List<E> getFullFathers(E item){//获取当前节点的父节点E parent=this.getParent(item);//递归终止条件if (parent==null){return new ArrayList<>();       //此处return直接返回ArrayList容器对象}List<E> list=this.getFullFathers(parent);list.add(parent);return list;}//获取当前节点的子孙节点private List<E> getGrandChild(E item){//创建容器装载当前节点所有子孙节点List<E> list= new ArrayList<>();List<E> child=this.getChild(item);if (child==null){return list;}for (int i = 0; i <child.size() ; i++) {E ele = child.get(i);List<E> temp =this.getGrandChild(ele);      //将list易容成temp,list就是temp,返回的list,与temp等同temp.add(ele);           //因为list与temp等同,所以此处使用谁都行list.addAll(temp);      //list不能与list求并集,因此使用temp代替list}return list;}public static void main(String[] args) {Text5<String> uu=new Text5<>();uu.add("root","生物");uu.add("生物","植物");uu.add("生物","动物");uu.add("生物","动物");uu.add("动物","脊索动物");uu.add("动物","脊椎动物");uu.add("动物","肠腔动物");uu.add("脊椎动物","哺乳动物");uu.add("脊椎动物","鱼类");uu.add("哺乳动物","猫");uu.add("哺乳动物","牛");uu.add("哺乳动物","人");System.out.println("========获取当前节点的父节点=========");String aa = uu.getParent("鱼类");System.out.println(aa);System.out.println("========获取当前节点的父节点=========");List<String> bb = uu.getChild("脊椎动物");for (int i = 0; i <bb.size() ; i++) {System.out.println(bb.get(i));}System.out.println("==========获取兄弟节点==================");List<String> cc=uu.getBrother("动物");for (int i = 0; i < cc.size(); i++) {System.out.println(cc.get(i));}System.out.println("===========获取祖先节点================");List<String> dd = uu.getFullFathers("人");for (int i = 0; i <dd.size() ; i++) {System.out.println(dd.get(i));}System.out.println("============获取子孙节点==============");List<String> ff=uu.getGrandChild("root");for (int i = 0; i <ff.size() ; i++) {System.out.println(ff.get(i));}}
}

Java学习笔记<十六>(树形结构存储)相关推荐

  1. Java学习系列(十六)Java面向对象之基于TCP协议的网络通信

    TCP/IP的网络分层模型:应用层(HTTP/FTP/SMTP/POPS...),传输层(TCP协议),网络层(IP协议,负责为网络上节点分配唯一标识),物理层+数据链路层). IP地址用于标识网络中 ...

  2. 电脑安装python3.74_python3.4学习笔记(十六) windows下面安装easy_install和pip教程

    python3.4学习笔记(十六) windows下面安装easy_install和pip教程 easy_install和pip都是用来下载安装Python一个公共资源库PyPI的相关资源包的 首先安 ...

  3. Polyworks脚本开发学习笔记(十六)-用C#进行Polyworks二次开发

    Polyworks脚本开发学习笔记(十六)-用C#进行Polyworks二次开发 Polyworks支持C#二次开发,用对应的SDK文档试着做一下开发样例. 新建一个C#项目,在解决方案中右键添加引用 ...

  4. Mr.J-- jQuery学习笔记(十六)--展开和收起动画折叠菜单的实现

    之前写过动画的隐藏与显示:Mr.J-- jQuery学习笔记(十四)--动画显示隐藏 动画隐藏与显示的一个小demo--对联广告:Mr.J-- jQuery学习笔记(十五)--实现页面的对联广告 与动 ...

  5. C语言结构体变量和结构体数组-学习笔记(十六)

    一.结构体变量 1.结构体概念 将不同类型的数据组合成一个有机的整体即为结构体.结构体由许多组织在一起的数据项组成,这些数据项不需要属于同一类型. 2.结构体类型及结构体变量定义 (1)结构体类型声明 ...

  6. 【Java学习笔记十】输入输出流

    在Java.io包中提供了一系列用于处理输入/输出的流类.从功能上分为两类:输入流和输出流.从六结构上可分为:字节流(以字节为处理单位)和字符流(以字符为处理单位). 字符是由字节组成.在Java中所 ...

  7. 反射、Lambda表达式(Java学习笔记十二)

    文章目录 反射 Class 类 创建运行时类的对象 获取运行时类的完整结构 调用运行时类的指定结构 调用指定方法 调用指定属性 关于setAccessible方法的使用: 动态代理 Lambda表达式 ...

  8. 【theano-windows】学习笔记十六——深度信念网络DBN

    前言 前面学习了受限玻尔兹曼机(RBM)的理论和搭建方法, 如果稍微了解过的人, 肯定知道利用RBM可以堆叠构成深度信念网络(deep belief network, DBN)和深度玻尔兹曼机(dee ...

  9. Java学习笔记十:Java的数组以及操作数组

    Java的数组以及操作数组 一:什么是数组: 数组可以理解为是一个巨大的"盒子",里面可以按顺序存放多个类型相同的数据,比如可以定义 int 型的数组 scores 存储 4 名学 ...

  10. B站韩顺平java学习笔记(六)--面向对象编程章节

    目录 一.类和对象 1.定义及区别 2.对象内存布局 3.属性/成员变量 (1)基本介绍 (2)注意事项和细节说明 (3)访问属性 4.对象 (1)创建对象 (2)对象分配机制 ​(3)Java创建对 ...

最新文章

  1. 【怎样写代码】复杂对象的组装与创建 -- 建造者模式(四):扩展案例
  2. php多维数组和对象,在PHP中将多维多对象数组转换为标准多维数组
  3. scala函数的定义语法说明
  4. python手机自动化测试脚本语言_Python+Appium实现APP自动化测试
  5. [Leedcode][JAVA][第15题][三数之和][数组][双指针]
  6. codeforces 58A-C语言解题报告
  7. Lock的lockInterruptibly()
  8. 如何在weblogic启动时让其加载指定的jar库文件
  9. 看门狗(APB watchdog)简介,各个寄存器简介,把看门狗挂到APB总线上,看门狗的验证测试(1)
  10. 计算机网络技术之网络系统设计与组建工程
  11. 安装以太坊客户端geth的方法
  12. css属性~(积少成多)
  13. 苹果系统tft选哪个服务器不卡,TFT是什么
  14. java date类1900,java - 使用javax.validation验证日期不得少于1900-01-01 - 堆栈内存溢出...
  15. 2022-2028全球民宿行业调研及趋势分析报告
  16. en55032最新标准下载_欧盟多媒体设备CE认证将使用新标准EN55032
  17. sql,linq,lamd比较使用
  18. 查询oracle所有回收站,oracle 回收站
  19. Supervisor socket.error No such file or directory file /usr/lib64/pyth
  20. fastdfs连接mysql_使用fastdfs-zyc监控FastDFS文件系统

热门文章

  1. IE 6下测试有scriptManager控件的页面,内存不断增长
  2. ubuntu16.04下安装MATLAB R2017b的步骤详解(附完整破解安装包)
  3. 《原生爬虫》爬取某直播平台某分类下的主播人气,生成排行榜
  4. 想练一手好字 从模仿开始
  5. mongodb密码恢复
  6. 华宝新能通过注册:拟募资近7亿 营收增加利润反而下降
  7. Modernizr YepNope Tips
  8. 工作的意义到底是什么
  9. git规范代码提交格式:commitlint+husky安装
  10. cool-admin框架使用