package graphx

 import java.util.ArrayList
import java.util.List /**
* Created by zhen on 2018/12/28.
*/
object TreeParent { class Node {
var id: String = ""
var parent: Int = 0 def this(id: String) {
this()
this.id = id
} def this(id: String, parent: Int) {
this()
this.id = id
this.parent = parent
} override def toString: String = {
return "TreeParent$Node [id=" + id + ", parent=" + parent + "]"
}
}
} class TreeParent {
private val list : List[TreeParent.Node] = new ArrayList[TreeParent.Node]()
private var nodeNums: Int = 0 /**
* 指定根节点创建树
*/
def this(id: String) {
this()
list.add(new TreeParent.Node(id, -1))
nodeNums += 1
} /**
* 指定根节点、指定treeSize创建树
*/
def this(id: String, treeSize: Int) {
this()
list.add(new TreeParent.Node(id, -1))
nodeNums += 1
} /**
* 获取某个节点的索引值
*/
def getNodeIndex(node: TreeParent.Node): Int = {
for(i<- 0 until list.size())
{
if (list.get(i) eq node) {
return i
}
}
return -1
} /**
* 为指定节点添加子节点
*/
def addNode(id: String, parent: TreeParent.Node) {
list.add(new TreeParent.Node(id, getNodeIndex(parent)))
} /**
* 判断树是否为空
*/
def isEmpty: Boolean = {
return list.get(0) == null
} /**
* 返回根节点
*/
def getRoot: TreeParent.Node = {
return list.get(0)
} /**
* 返回指定节点(非根节点)的父节点
*/
def getParent(node: TreeParent.Node): TreeParent.Node = {
return list.get(node.parent)
} def getNodeByid(id: String): TreeParent.Node = {
for(i<- 0 until list.size())
{
if (list.get(i).id eq id) {
return list.get(i)
}
}
System.out.println("树中不存在包含该数据的节点")
return null
} /**
* 返回指定节点(非叶子节点)的所有子节点
*/
def getChildren(parent: TreeParent.Node): List[TreeParent.Node] = {
val childrenList : List[TreeParent.Node] = new ArrayList[TreeParent.Node]()
for(i <- 0 until list.size()){
if (list.get(i) != null && list.get(i).parent == getNodeIndex(parent)) {
childrenList.add(list.get(i))
}
}
return childrenList
}
} object TreeAI {
def main(args: Array[String]) {
val tree: TreeParent = new TreeParent("root")
val root: TreeParent.Node = tree.getRoot
System.out.println(root)
tree.addNode("A", root)
tree.addNode("B", root)
val A: TreeParent.Node = tree.getNodeByid("A")
val B: TreeParent.Node = tree.getNodeByid("B")
tree.addNode("C", A)
tree.addNode("D", A)
tree.addNode("E", B)
tree.addNode("F", B)
tree.addNode("G", B)
tree.addNode("H", root)
val H: TreeParent.Node = tree.getNodeByid("H")
tree.addNode("I", H)
val list: List[TreeParent.Node] = tree.getChildren(root)
System.out.println("A节点的子节点为:")
import scala.collection.JavaConversions._
for (node <- list) {
System.out.println(node)
}
}
}

结果:

Scala实现树形结构的更多相关文章

  1. js文章列表的树形结构输出

    文章表设计成这样了 后端直接给了无任何处理的json数据,现在要前端实现树形结构的输出,其实后端处理更简单写,不过既然来了就码出来 var doclist = [{ "id": 1 ...

  2. GridView 树形结构分组的功能

    在“会飞的鱼”博客中看到GridView实现树形结构的代码,经过修改,添加了树形结构中的复选框功能,欢迎吐槽. 源地址:http://www.cnblogs.com/chhuic/archive/20 ...

  3. [从产品角度学EXCEL 02]-EXCEL里的树形结构

    这是<从产品角度学EXCEL>系列第三篇. 前言请看: 0 为什么要关注EXCEL的本质 1 excel是怎样运作的 或者你可以去微信公众号@尾巴说数 获得连载目录. 本文仅由尾巴本人发布 ...

  4. C# EasyUI树形结构权限管理模块

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 本节和大家探讨下C#使用EasyUI树形结构/Tree构 ...

  5. YbSoftwareFactory 代码生成插件【十八】:树形结构下的查询排序的数据库设计

    树形结构的排序在中国特色下十分普遍也非常重要,例如常说的五大班子,党委>人大>政府>政协>纪委,每个班子下还有部门,岗位,人员,最终排列的顺序通常需要按权力大小.重要性等进行排 ...

  6. Java创建树形结构算法实例

    在JavaWeb的相关开发中经常会涉及到多级菜单的展示,为了方便菜单的管理需要使用数据库进行支持,本例采用相关算法讲数据库中的条形记录进行相关组装和排序讲菜单组装成树形结构. 首先是需要的JavaBe ...

  7. Atitit 常见的树形结构 红黑树  二叉树   B树 B+树  Trie树 attilax理解与总结

    Atitit 常见的树形结构 红黑树  二叉树   B树 B+树  Trie树 attilax理解与总结 1.1. 树形结构-- 一对多的关系1 1.2. 树的相关术语: 1 1.3. 常见的树形结构 ...

  8. 使用ztree.js,受益一生,十分钟学会使用tree树形结构插件

    看到ztree.js,这几个字眼,毋庸置疑,那肯定就是tree树形结构了,曾经的swing年代有jtree,后来jquery年代有jstree和treeview,虽然我没写过,但是我见过,一些小功能做 ...

  9. Linux/Ubuntu tree 命令以树形结构显示文件夹目录结构

    1.安装命令工具 sudo apt-get -y install tree 2.可以查看关于tree命令的帮助信息 $ tree --help usage: tree [-adfghilnpqrstu ...

随机推荐

  1. EntityFramework中对象的状态管理(笔记)

    刚开始接触EF框架的时候总是不明白: 为什么查询出来的对象 Remove().再 SaveChanges()就会把数据删除.而自己 new 一个Person()对象,然后 Remove()不行? 为什 ...

  2. python练习四—简单的聊天软件

    python最强大的是什么?库支持!!有了强大的库支持,一个简单的聊天软件实现就更简单了,本项目思路如下 # 项目思路 1. 服务器的工作 * 初始化服务器 * 新建一个聊天房间 * 维护一个已链接用 ...

  3. react入门学习及总结

    前言 不知不觉一年又过去了,新的一年又到来,2019应该要好好思考,好好学点有用的东西,规划下自己今后的学习方向,不要再像以前那样感觉很迷茫. react简单介绍 官网及中文文档 https://re ...

  4. 深入理解Java虚拟机阅读心得(一)

    JVM(Java Virtual Machine) 即Java虚拟机,是一种用于计算设备的规范,用于运行Java程序编译后得到的字节码文件(Class文件) 一.JVM的内存区域 1.程序计数器(Pr ...

  5. Linux comm命令求出文件的交集、差集

    A(1,2,3)和B(3,4,5),A和B的交集是3,A对B的差集是1和2,B对A的差集是4和5,A和B求差的结果是1.2.4.5. 在Linux中可以使用comm命令求出这些集. [root@xue ...

  6. Go基础系列:指定goroutine的执行顺序

    Go channel系列: channel入门 为select设置超时时间 nil channel用法示例 双层channel用法示例 指定goroutine的执行顺序 当关闭一个channel时,会 ...

  7. 南大算法设计与分析课程OJ答案代码(5)--割点与桥和任务调度问题

    问题 A: 割点与桥 时间限制: 1 Sec  内存限制: 5 MB提交: 475  解决: 34提交 状态 算法问答 题目描述 给出一个无向连通图,找到所有的割点和桥 输入 第一行:点的个数,如果点 ...

  8. 隐藏马尔科夫模型HMM

    概率图模型 HMM 先从一个具体的例子入手,看看我们要解决的实际问题.例子引自wiki.https://en.wikipedia.org/wiki/Hidden_Markov_model Consid ...

  9. C#函数返回值。

    一.params. 可变参数,无论有几个参数,必须出现在参数列表的最后,可以为可变参数直接传递一个对应类型的数组. class Program { static void Main(string[] ...

  10. 快速搭建一个Quartz定时任务【转载,好文 ,值得收藏,亲身试用 效果不错】

    Quartz.NET 入门 概述 Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等. Quartz.NET允许开发人员根据时间间隔 ...