2017-08-06 1 views
2

il y a un contenu de fichier comme ci-dessous ("1.txt")comment construire un arbre puis traverser chaque feuille (du nœud racine à la feuille à chaque fois)?

1.txt:

a,b 
b,c 
c,d 
c,e 
a,i 
a,f 
f,g 
f,h 

la structure arborescente comme:

   a 
     b i  f 
    c   g h 
d e  

prévu:

a->b->c->d 
a->b->c->e 
a->i 
a->f->g 
a->f->h 
+1

si le fichier contient 'a, b a, c a, d x, Z'? Qu'avez-vous essayé jusqu'à présent et sur quoi êtes-vous accroché? – jwvh

+0

thx @jwvh en fait, le fichier est les données de menu en cascade. donc pas de "x, z" existe. chaque nœud existe relation – mop

Répondre

2

Cela devrait fonctionner. J'ai sauté la partie où l'arbre est construit à partir de la lecture du fichier texte, car c'est assez simple.

case class Node(node: String, children: Seq[Node] = Seq()) { 
    override def equals(that: Any): Boolean = 
     that match { 
      case that: Node if this.node == that.node => true 
      case _ => false 
    } 
    override def toString = node 
} 

val d= Node("d") 
val e = Node("e") 
val g = Node("g") 
val h = Node("h") 
val i = Node("i") 
val c = Node("c", Seq(d,e)) 
val f = Node("f", Seq(g, h)) 
val b = Node("b", Seq(c)) 
val a = Node("a", Seq(b,f,i)) 

val tree = a :: b :: c :: d :: e :: f :: g :: h :: i :: Nil 

def traverse(tree: Seq[Node]): Seq[Seq[Node]] = { 
    import scala.annotation.tailrec 
    val leafNodes = tree.filter(x => x.children.isEmpty) 
    @tailrec  
    def walk(node: Node, descendants: Seq[Node] = Seq()): Seq[Node] = { 
     tree.find(x => x.children.contains(node)) match { 
      case Some(x) => walk(x, (descendants :+ node)) 
      case None => descendants :+ node 
     } 
    } 
    leafNodes.map(walk(_, Seq()).reverse) 
} 

sortie:

scala> traverse(tree) 
res26: Seq[Seq[Node]] = List(List(a, b, c, d), List(a, b, c, e), List(a, f, g), List(a, f, h), List(a, i)) 
+0

thx @ rogue-one. le fichier est les données du menu. il est "un" à "plusieurs" pour chaque nœud, mais seulement un nœud racine; par exemple: 'a, b a, c a, d'. si comme ça comment le résoudre? – mop

+0

@mop vous voulez dire que l'arbre n'est pas un arbre binaire? –

+0

oui. @ Rogue-un. pas d'arbre binaire. désolé, je l'ai rendu ambigu. tout à l'heure, j'ai réédité la question. – mop