zoukankan      html  css  js  c++  java
  • Scala实现树形结构

      1 package graphx
      2 
      3 import java.util.ArrayList
      4 import java.util.List
      5 
      6 /**
      7   * Created by zhen on 2018/12/28.
      8   */
      9 object TreeParent {
     10 
     11   class Node {
     12     var id: String = ""
     13     var parent: Int = 0
     14 
     15     def this(id: String) {
     16       this()
     17       this.id = id
     18     }
     19 
     20     def this(id: String, parent: Int) {
     21       this()
     22       this.id = id
     23       this.parent = parent
     24     }
     25 
     26     override def toString: String = {
     27       return "TreeParent$Node [id=" + id + ", parent=" + parent + "]"
     28     }
     29   }
     30 }
     31 
     32 class TreeParent {
     33   private val list : List[TreeParent.Node] = new ArrayList[TreeParent.Node]()
     34   private var nodeNums: Int = 0
     35 
     36   /**
     37     * 指定根节点创建树
     38     */
     39   def this(id: String) {
     40     this()
     41     list.add(new TreeParent.Node(id, -1))
     42     nodeNums += 1
     43   }
     44 
     45   /**
     46     * 指定根节点、指定treeSize创建树
     47     */
     48   def this(id: String, treeSize: Int) {
     49     this()
     50     list.add(new TreeParent.Node(id, -1))
     51     nodeNums += 1
     52   }
     53 
     54   /**
     55     * 获取某个节点的索引值
     56     */
     57   def getNodeIndex(node: TreeParent.Node): Int = {
     58     for(i<- 0 until list.size())
     59     {
     60       if (list.get(i) eq node) {
     61         return i
     62       }
     63     }
     64     return -1
     65   }
     66 
     67   /**
     68     * 为指定节点添加子节点
     69     */
     70   def addNode(id: String, parent: TreeParent.Node) {
     71     list.add(new TreeParent.Node(id, getNodeIndex(parent)))
     72   }
     73 
     74   /**
     75     * 判断树是否为空
     76     */
     77   def isEmpty: Boolean = {
     78     return list.get(0) == null
     79   }
     80 
     81   /**
     82     * 返回根节点
     83     */
     84   def getRoot: TreeParent.Node = {
     85     return list.get(0)
     86   }
     87 
     88   /**
     89     * 返回指定节点(非根节点)的父节点
     90     */
     91   def getParent(node: TreeParent.Node): TreeParent.Node = {
     92     return list.get(node.parent)
     93   }
     94 
     95   def getNodeByid(id: String): TreeParent.Node = {
     96     for(i<- 0 until list.size())
     97     {
     98       if (list.get(i).id eq id) {
     99         return list.get(i)
    100       }
    101     }
    102     System.out.println("树中不存在包含该数据的节点")
    103     return null
    104   }
    105 
    106   /**
    107     * 返回指定节点(非叶子节点)的所有子节点
    108     */
    109   def getChildren(parent: TreeParent.Node): List[TreeParent.Node] = {
    110     val childrenList : List[TreeParent.Node] = new ArrayList[TreeParent.Node]()
    111     for(i <- 0 until list.size()){
    112       if (list.get(i) != null && list.get(i).parent == getNodeIndex(parent)) {
    113         childrenList.add(list.get(i))
    114       }
    115     }
    116     return childrenList
    117   }
    118 }
    119 
    120 object TreeAI {
    121   def main(args: Array[String]) {
    122     val tree: TreeParent = new TreeParent("root")
    123     val root: TreeParent.Node = tree.getRoot
    124     System.out.println(root)
    125     tree.addNode("A", root)
    126     tree.addNode("B", root)
    127     val A: TreeParent.Node = tree.getNodeByid("A")
    128     val B: TreeParent.Node = tree.getNodeByid("B")
    129     tree.addNode("C", A)
    130     tree.addNode("D", A)
    131     tree.addNode("E", B)
    132     tree.addNode("F", B)
    133     tree.addNode("G", B)
    134     tree.addNode("H", root)
    135     val H: TreeParent.Node = tree.getNodeByid("H")
    136     tree.addNode("I", H)
    137     val list: List[TreeParent.Node] = tree.getChildren(root)
    138     System.out.println("A节点的子节点为:")
    139     import scala.collection.JavaConversions._
    140     for (node <- list) {
    141       System.out.println(node)
    142     }
    143   }
    144 }

    结果:

  • 相关阅读:
    泛型约束where条件的使用(可以通过类型参数动态反射创建实例)
    设计模式之java源码-工厂方法模式
    软件定义网络基础---OF-Config协议
    软件定义网络基础---OpenFlow协议
    软件定义网络基础---南向接口协议概述
    软件定义网络基础---OpenFlow流表
    软件定义网络基础---OpenFlow概述
    软件定义网络基础---SDN数据平面
    软件定义网络基础---SDN的核心思想
    MACVLAN虚拟网卡技术
  • 原文地址:https://www.cnblogs.com/yszd/p/10208799.html
Copyright © 2011-2022 走看看