Play scala 5 二叉树的实现

二叉树为度为2的有序树

本博客用scala实现对二叉树的最简单操作:求最大值,求深度,求总结点数, map函数

你会发现, scala允许我们用最自然的方式思考问题,并将这种思考直接转化为代码。

为了简单起见,本实现中只有叶子节点有值,其它节点不可存值。

这次使用的开发环境为IDEA

  1. 二叉树的基本组件: 叶子和树枝

Tree.scala

sealed trait Tree[+T] 
case class Leaf[T](value: T) extends Tree[T]
case class Branch[T](left: Tree[T], right: Tree[T]) extends Tree[T]

2. 创建一个树用来做测试

MyTree.sc

val one = Leaf(1)
val two = Leaf(2)
val three = Leaf(3)
val four = Leaf(4)
val five = Leaf(5)

val myTree = Branch(
Branch(one, two),
Branch(Branch(three, four), five)
)

3. 添加size方法

sealed trait Tree[+T] {
  def size: Int
}
case class Leaf[T](value: T) extends Tree[T] {
  def size = 1
}
case class Branch[T](left: Tree[T], right: Tree[T]) extends Tree[T] {
  def size = left.size + right.size + 1
}

这个方法也可以在trait中实现,不过要用pattern match。直接在子类中实现更方便


4. 求最大值

object Tree {
  def maximum(tree: Tree[Int]): Int = tree match {
    case Leaf(x) => x
    case Branch(left, right) => maximum(left) max maximum(right)
  }
}

这里将maximu作为外部函数 ,因为要用到max方法,而我们不要求每个类型都有max方法


5. 求深度

sealed trait Tree[+T] {
  def size: Int
  def depth: Int
}
case class Leaf[T](value: T) extends Tree[T] {
  def size = 1
  def depth = 1
}
case class Branch[T](left: Tree[T], right: Tree[T]) extends Tree[T] {
  def size = left.size + right.size + 1
  def depth = (left.depth max right.depth) + 1
}

说白了,都是递归

6. map方法

sealed trait Tree[+T] {
  def size: Int
  def depth: Int
  def map[S](f: T => S): Tree[S] = this match {
    case Leaf(value) => Leaf(f(value))
    case Branch(left, right) => Branch(left map f, right map f)
  }
}

7.测试

import ch3._
import ch3.Tree._

val one = Leaf(1)
val two = Leaf(2)
val three = Leaf(3)
val four = Leaf(4)
val five = Leaf(5)

val myTree = Branch(
  Branch(one, two),
  Branch(Branch(three, four), five)
)

myTree.size
maximum(myTree)
myTree.depth
myTree.map(_ + 10)
myTree.map("a" + _.toString)

截屏

wKioL1SeMrSi0rH1AAVvIktp8Ng990.jpg



你可能感兴趣的:(scala,二叉树)