在scala中生成树

在scala中生成树,scala,data-structures,tree,Scala,Data Structures,Tree,我正在学习Scala,我正在使用的这本书提供了一个练习,要求我在树结构上定义一些函数 树定义为: sealed trait Tree[+A] case class Leaf[A](value: A) extends Tree[A] case class Branch[A](left: Tree[A], right: Tree[A]) extends Tree[A] 其中一个练习是计算树中的节点数。 我写了这个函数,但我不能检查它是否工作,因为我没有任何树的例子 我如何生成一个小的树来测试我的代

我正在学习Scala,我正在使用的这本书提供了一个练习,要求我在树结构上定义一些函数

树定义为:

sealed trait Tree[+A]
case class Leaf[A](value: A) extends Tree[A]
case class Branch[A](left: Tree[A], right: Tree[A]) extends Tree[A]
其中一个练习是计算树中的节点数。 我写了这个函数,但我不能检查它是否工作,因为我没有任何树的例子

我如何生成一个小的树来测试我的代码

一次向树中添加一个元素是可能的,但这似乎需要做很多工作。

就像

val tree = Branch(
             Branch(
               Leaf(12),
               Branch(
                 Leaf(3),
                 Leaf(4))),
             Leaf(8))
那应该是那棵树

你可以在更大的树上重复使用。关键是,你要自下而上构建,你不能在底层做任何事情,这需要从头开始创建一个新的树

val biggerTree = Branch(Branch(something, tree), stillSomethingElse)

作为@dhg答案的补充,一个变量生成一棵具有给定数量分支的树(注意:总的分支数总是比分支数多一片叶子,因此总的分支数+叶子数总是奇数)。这将使测试变得简单

def randomTree(branchCount: Int): Tree[Int] =
  if(branchCount == 0) Leaf(0) // whatever, you can put a random here
  else {
     val branchCountAtLeft = util.Random.nextInt(branchCount) 
          // between 0 and branchCount - 1
     val branchCountAtRight = branchCount - 1 - branchCountAtLeft
     Branch(randomTree(branchCountAtLeft), randomTree(branchCountAtRight))
  }

@Didier的答案很适合手工制作自己的树,但如果您想自动生成树,可以使用一个小小的递归生成器:

def generate(p: Double): Tree[Int] = {
  if (util.Random.nextDouble < p)
    Branch(generate(p), generate(p))
  else
    Leaf(0)
}
你会得到一棵随机树。降低
p
会使树木变小;提高它会使它们变得更大

显然,这将使所有叶子的树具有相同的值。如果需要随机叶值,请尝试:

 Leaf(util.Random.nextInt(100))

除非您创建一个方法来处理创建树和向树中添加节点的操作,否则您必须手工完成。对树的简单插入并不复杂,而且本身就是一个很好的练习:)正确的版本可能应该有
分支(生成(p),生成(p))
?@Donbeo,oops,是的,修复了。
val t = generate(0.5)
println(t)
 Leaf(util.Random.nextInt(100))