用父节点表示法表示一棵树
今天学习,把书上的代码自己边对照,边敲了一下。
package mytree;import java.util.ArrayList;
import java.util.List;/*** 用父节点表示法表示一棵树。* * @author lirui* @param <E>*/
public class TreeParent<E> {public static class Node<T> {T data;// 记录父节点的位置。int parent;public Node() {}public Node(T data) {this.data = data;}public Node(T data, int parent) {this.data = data;this.parent = parent;}@Overridepublic String toString() {return "TreeParent$Node[data=" + data + " , parent=" + parent + "]";}}private final int DEFAULT_TREE_SIZE = 100;private int treeSize = 0;// 使用数Node[]组来记录树中所有节点。private Node<E>[] nodes;// 记录节点个数。private int nodeNums;// 以指定根节点创建树。public TreeParent(E dataE) {treeSize = DEFAULT_TREE_SIZE;nodes = new Node[treeSize];nodes[0] = new Node<E>(dataE, -1);nodeNums++;}// 以指定根节点,指定treeSize创建树public TreeParent(E dataE, int treeSize) {this.treeSize = treeSize;nodes = new Node[treeSize];nodes[0] = new Node<>(dataE, -1);nodeNums++;}// 为指定节点添加子节点。public void add(E dataE, Node parent) {for (int i = 0; i < treeSize; i++) {// 找到数组中第一个为null的元素,该元素保存新节点。if (nodes[i] == null) {nodes[i] = new Node<>(dataE, pos(parent));nodeNums++;return;}}throw new RuntimeException("该树已满,无法添加新节点。");}// 返回包含指定值的节点。Fpublic int pos(Node node) {for (int i = 0; i < treeSize; i++) {if (nodes[i] == node) {return i;}}return -1;}// 判断树是否为空public boolean empty() {// 根节点是否为nullreturn nodes[0] == null;}// 返回根节点。public Node<E> root() {return nodes[0];}// 返回指定节点(非根节点)的父节点。public Node<E> parent(Node node) {return nodes[node.parent];}// 返回指定节点,非叶子节点的所有子节点。public List<Node<E>> children(Node<E> parent) {List<Node<E>> list = new ArrayList<>();int parentposition = pos(parent);for (int i = 0; i < treeSize; i++) {if (nodes[i] != null && nodes[i].parent == parentposition) {list.add(nodes[i]);}}return list;}// 返回该树的深度。public int deep() {// 用于记录最大深度。int max = 0;for (int i = 0; i < treeSize && nodes[i] != null; i++) {// 初始化本节点深度。int def = 1;// m 记录当前父节点位置int m = nodes[i].parent;// 如果父节点存在while (m != -1 && nodes[m] != null) {// 继续向上搜索父节点。由于从子节点很容易搜索到父节点,所以向上搜索,而不是向下找。m = nodes[m].parent;def++;}if (max < def) {max = def;}}return max;}public static void main(String[] args) {TreeParent<String> tp = new TreeParent<String>("root");TreeParent.Node root = tp.root();System.out.println(root);tp.add("节点一", root);System.out.println("该树的深度:"+tp.deep());tp.add("节点二", root);// 获取根节点的所有节点。List<Node<String>> childrenList = tp.children(root);for (Node<String> node : childrenList) {System.out.print(node+" ");}System.out.println();// 为根节点的第一个节点增加子节点。tp.add("节点三", childrenList.get(0));System.out.println("该树的深度:"+tp.deep());}
}
相关文章:

AJAX学习基础:简单介绍数据岛使用方法
数据岛指的是存在Html网页中的xml代码段,它在Html中形成了一个数据的集合,数据岛允许我们在Html网页中集成xml,对xml编写脚本. 数据岛有它特有的形式,由标记xml开始,在开始标记中要有一个ID属性,用于指定…

《UG NX8.0中文版完全自学手册》一第1章 UG NX 8.0简介
本节书摘来自异步社区《UG NX8.0中文版完全自学手册》一书中的第1章,作者 刘昌丽 , 周进,更多章节内容可以访问云栖社区“异步社区”公众号查看 第1章 UG NX 8.0简介 UG NX8.0中文版完全自学手册UG(Unigraphics)是Unigraphics Sol…
自己动手设计RESTful API
文桥,13级机械工程系,机械电子工程专业,大四学生。在LSGO软件技术团队负责前端部分,本图文是介绍目前流行的前后端分离技术的最后一篇(一共六篇),也是对以前技术进行归纳后用于实战的一篇&#…

Java assert关键字
一、概述 在C和C语言中都有assert关键,表示断言。 在Java中,同样也有assert关键字,表示断言,用法和含义都差不多。 二、语法 在Java中,assert关键字是从JAVA SE 1.4 引入的,为了避免和老版本的Java代…

C#动态加载DLL
< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd> 利用反射进行动态加载和调用.Assembly assAssembly.LoadFrom(DllPath); //利用dll的路径加载 加载dll后,需要使用dll中某类.Type typeass.GetType(“TypeName”);//利用类型的命名空…
Matlab与线性代数 -- 矩阵的左除
打磨一项技能最需要的就是耐心,我们知道做一件事情不会一蹴而就,需要长时间的积累。关于Matlab的打磨会持续很长的时间,每天学习一个知识点,一年下来就不得了。要有耐心,要有耐心,跟着我们每天花5分钟的时间…

《JavaScript应用程序设计》一一2.3 lambdas
本节书摘来华章计算机出版社《JavaScript应用程序设计》一书中的第2章,第2.3节,作者:Eric Elliott 更多章节内容可以访问云栖社区“异步社区”公众号查看。 2.3 lambdas lambdas是指那些作为数据使用的函数,它可以是函数的传入参数…

Java异常体系结构
一、 异常的概念和Java异常体系结构 异常是程序运行过程中出现的错误。本文主要讲授的是Java语言的异常处理。Java语言的异常处理框架, 是Java语言健壮性的一个重要体现。 Java把异常当作对象来处理,并定义一个基类java.lang.Throwable…

关于IssueVision命令模式中对象生命周期的困惑
在IssueVision的命令模式中有如下代码(\Patterns\Commander.cs)public static void Connect(ToolBarButton button, Command command){ToolBarButtonCommander unused new ToolBarButtonCommander(button, command);}按理说unused是内部变量,生命周期应该在Connect方法的作用范…

《树莓派开发实战(第2版)》——1.15 使用蓝牙设备
本节书摘来自异步社区《树莓派开发实战(第2版)》一书中的第1章,第1.15节,作者[英]Simon Monk(蒙克),韩波 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.15 使用蓝牙…
C#语言与面向对象技术(5)
本图文主要掌握以下问题: 1. 什么是接口? 2. 接口的实现与类的继承有什么区别? 3. 接口与抽象类的相同点与不同点在哪里? 4. C#允许一个类实现多个接口,若多个接口中存在重名方法,如何处理?…

Java序列化的机制和原理
有关Java对象的序列化和反序列化也算是Java基础的一部分,下面对Java序列化的机制和原理进行一些介绍。 Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节…

转 --有些事情需要注意
1:能不抽烟最好不抽,它或许可以帮助你吸引一些女生,但不抽绝不会招来厌烦,表现男子气概的途径有很多,没必要拿健康做赌注。2:给自己定目标,一年,两年,五年,也许你出生不如…

《Python数据分析与挖掘实战》一3.1 数据质量分析
本节书摘来自华章出版社《Python数据分析与挖掘实战》一书中的第3章,第3.1节,作者 张良均 王路 谭立云 苏剑林,更多章节内容可以访问云栖社区“华章计算机”公众号查看 3.1 数据质量分析 数据质量分析是数据挖掘中数据准备过程的重要一环&am…
Matlab与线性代数 -- 矩阵的右除
打磨一项技能最需要的就是耐心,我们知道做一件事情不会一蹴而就,需要长时间的积累。关于Matlab的打磨会持续很长的时间,每天学习一个知识点,一年下来就不得了。要有耐心,要有耐心,跟着我们每天花5分钟的时间…

Java中的值传递和引用传递
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参…

ASP.NET网站建设基本常用代码
1.为按钮添加确认对话框Button.Attributes.Add("onclick","return confirm(确认?)");Button.Attributes.Add("onclick","if(confirm(确定?)){return true;}else{return false;}") 2.表格超连接列传递参数<asp:HyperLinkColumn Ta…
C#语言与面向对象技术(6)
本图文主要掌握以下问题: 1.什么是“类型安全”问题? 2.为什么要引入泛型? 3.什么是泛型? 4.泛型是如何实现的? 5.类与类之间存在哪些关系,如何表示?

Xposed: 勾住(Hook) Android应用程序对象的方法,实现AOP
Xposed Xposed能够勾住(Hook) Android应用程序对象的方法,实现AOP,一个简单的例子: public class WebViewHook implements IXposedHookLoadPackage {// handleLoadPackage 会在android加载每一个apk后执行public void handleLoadPackage(Load…

Servlet防止页面被客户端缓存
服务器端的HttpServlet可通过设置特定HTTP响应头来禁止客户端缓存网页,以下示范代码中的response变量引用HttpServletResponse对象: response.addHeader("Pragma","no-cache"); response.setHeader("Cache-Control","…

二进制存储图片
二进制存储图片 如果我们要将一个图片文件二进制于数据库中,那么我们就必须将图片文件转化为二进制数据内容,再将二进制数据存储至数据库中,这是图片存储(或是其它文件数据库存储)的基本原则。 至于要从数据库中读取图…

《HTML5开发手册》——2.4 初学者“菜谱”:使用address元素提供通信信息
本节书摘来自异步社区《HTML5开发手册》一书中的第2章,第2.4节,作者: 【美】Chuck Hudson , 【英】Tom Leadbetter 更多章节内容可以访问云栖社区“异步社区”公众号查看。 2.4 初学者“菜谱”:使用address元素提供通信信息 规范中将address…
Matlab与线性代数 -- 矩阵的转置
打磨一项技能最需要的就是耐心,我们知道做一件事情不会一蹴而就,需要长时间的积累。关于Matlab的打磨会持续很长的时间,每天学习一个知识点,一年下来就不得了。要有耐心,要有耐心,跟着我们每天花5分钟的时间…
做为程序员对sql进行的性能优化
今天面试,我简历上写了熟悉sql的性能优化,但是今天面试,一时想不起别的,就仅仅说出了一条,在这里再总结一些,完善自己的知识点。 我经常用的数据库是oracle,所以我的sql优化是程序员针对于orac…

asp.NET自定义服务器控件内部细节系列教程四
如大家要转载,请保留本人的版权:/* *Description:asp.NET自定义服务器控件内部细节系列教程*Auther:崇崇-天真的好蓝 *MSN:chongchong2008msn.com *Dates:2007-05-20*Copyright:ChongChong2008 YiChang HuBei China */四 服务器控件相关元数据Attribute 1.设计期A…

《C++游戏编程入门(第4版)》——1.12 习题
本节书摘来自异步社区出版社《C游戏编程入门(第4版)》一书中的第1章,第1.1节,作者:【美】Michael Dawson(道森),更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.12 习题 C…
Matlab与线性代数 -- 单位矩阵
打磨一项技能最需要的就是耐心,我们知道做一件事情不会一蹴而就,需要长时间的积累。关于Matlab的打磨会持续很长的时间,每天学习一个知识点,一年下来就不得了。要有耐心,要有耐心,跟着我们每天花5分钟的时间…
语句覆盖(Statement coverage)
一、语句覆盖(Statement coverage)“语句覆盖”是一个比较弱的测试标准,它的含义是:选择足够的测试用例,使得程序中每个语句至少都能被执行一次。 图6.4是一个被测试的程序,它的源程序…

RSS原理和实现
RSS是在互联网上被广泛采用的内容包装和投递协议。网络用户可以在客户端借助于支持RSS的新闻工具软件,在不打开网站内容页面的情况下,阅读支持RSS输出的网站内容。 1.RSS文件结构 示例: <?xml version"1.0" encoding"gb23…

consul安装配置使用
2019独角兽企业重金招聘Python工程师标准>>> 环境 centos:7.3 docker:1.12.6 kernel:3.10.0-514.6.1.el7.x86_64 consul:0.8.1 server1:10.1.13.221 server2:10.1.13.222 consul的功能 服务发现 健康检查 支持多数据中心 key/value存储 consul的使用场景 docker实例…