Это не идеально, просто служит примером. Все, что вам нужно сделать, - это пересечь дерево по глубине - сначала или по ширине и собрать результаты. В значительной степени то же, что и для flatten
.
1) Определить структуру дерева (я знаю, я знаю, что это не самый лучший способ сделать это :)):
scala> case class Node[T](value: T, left: Option[Node[T]] = None,
| right: Option[Node[T]] = None)
defined class Node
2) Создайте небольшое дерево:
scala> val tree = Node(13,
| Some(Node(8,
| Some(Node(1)), Some(Node(11)))),
| Some(Node(17,
| Some(Node(15)), Some(Node(25))))
|)
tree: Node[Int] = Node(13,Some(Node(8,Some(Node(1,None,None)),Some(Node(11,None,None)))),Some(Node(17,Some(Node(15,None,None)),Some(Node(25,None,None)))))
3) Реализовать функцию, которая может перемещаться дерево:
scala> def observe[T](node: Node[T], f: Node[T] => Unit): Unit = {
| f(node)
| node.left foreach { observe(_, f) }
| node.right foreach { observe(_, f) }
| }
observe: [T](node: Node[T], f: Node[T] => Unit)Unit
4) с его помощью можно определить функцию, которая выводит все значения:
scala> def printall = observe(tree, (n: Node[_]) => println(n.value))
printall: Unit
5) И, наконец, определить, что flatten
функция:
scala> def flatten[T](node: Node[T]): List[T] = {
| def flatten[T](node: Option[Node[T]]): List[T] =
| node match {
| case Some(n) =>
| n.value :: flatten(n.left) ::: flatten(n.right)
| case None => Nil
| }
|
| flatten(Some(node))
| }
flatten: [T](node: Node[T])List[T]
6) Давайте тест. Первая печать всех elems:
scala> printall
13
8
1
11
17
15
25
7) Run flatten
:
scala> flatten(tree)
res1: List[Int] = List(13, 8, 1, 11, 17, 15, 25)
Это своего рода общего назначения алгоритма дерева как обходе дерева. Я сделал его возвратом T
s вместо Node
s, измените его как хотите.
Пожалуйста, добавьте полное имя типа для 'Tree' (в стандартной библиотеке нет' Tree') и примеры входных данных и результата. – senia