Skip to main content
Code Review

Return to Answer

replaced http://codereview.stackexchange.com/ with https://codereview.stackexchange.com/
Source Link

As pointed out by @Bob Dalgleish, you mix mutable/immutable. You also mix pattern matching (enQueueNext) with if/else (bfs_visit). You also mix camel case notation (enQueueNext) with underscore notation (bfs_visit).

trait would be more appropriate for Tree than abstract class. You don't really need Tree, as I show in my example, but that is debatable. You don't really need a queue either.

You can make very succinct code with Scala. In my example below, the recursive BFS algorithm is basically a single line: bfsLoop(nextLayer.map(_.value) :: accum, nextLayer.flatMap(_.childrenLeftRight)).

object TreeTraversal extends App {
 case class Node[+T](value: T, left: Option[Node[T]], right: Option[Node[T]]) {
 def map[V](f: T => V): Node[V] = 
 Node(f(value), left.map(l => l.map(f)), right.map(r => r.map(f)))
 def childrenLeftRight: List[Node[T]] = List(left, right).flatten
 }
 def terminalNode[T](value: T) = Node(value, None, None)
 def dfs[T](tree: Node[T]): List[T] = {
 var output = List[T]()
 tree.map(t => (output = t :: output))
 output.reverse
 }
 def bfs[T](tree: Node[T]): List[T] = {
 @tailrec
 def bfsLoop(accum: List[List[T]], nextLayer: List[Node[T]]): List[T] = nextLayer match {
 case Nil => accum.reverse.flatten
 case _ => bfsLoop(nextLayer.map(_.value) :: accum, nextLayer.flatMap(_.childrenLeftRight))
 }
 bfsLoop(List[List[T]](), List(tree))
 }
 val tree1 = Node[Int](6, Some(Node(13, Some(terminalNode(101)), None)), Some(Node(42, Some(terminalNode(666)), Some(terminalNode(65)))))
 println("map: " + tree1.map(i => s"Hello$i"))
 println("dfs: " + dfs(tree1))
 println("bfs: " + bfs(tree1))
}

I also put this code for a separate codereview codereview after posting it as an answer.

As pointed out by @Bob Dalgleish, you mix mutable/immutable. You also mix pattern matching (enQueueNext) with if/else (bfs_visit). You also mix camel case notation (enQueueNext) with underscore notation (bfs_visit).

trait would be more appropriate for Tree than abstract class. You don't really need Tree, as I show in my example, but that is debatable. You don't really need a queue either.

You can make very succinct code with Scala. In my example below, the recursive BFS algorithm is basically a single line: bfsLoop(nextLayer.map(_.value) :: accum, nextLayer.flatMap(_.childrenLeftRight)).

object TreeTraversal extends App {
 case class Node[+T](value: T, left: Option[Node[T]], right: Option[Node[T]]) {
 def map[V](f: T => V): Node[V] = 
 Node(f(value), left.map(l => l.map(f)), right.map(r => r.map(f)))
 def childrenLeftRight: List[Node[T]] = List(left, right).flatten
 }
 def terminalNode[T](value: T) = Node(value, None, None)
 def dfs[T](tree: Node[T]): List[T] = {
 var output = List[T]()
 tree.map(t => (output = t :: output))
 output.reverse
 }
 def bfs[T](tree: Node[T]): List[T] = {
 @tailrec
 def bfsLoop(accum: List[List[T]], nextLayer: List[Node[T]]): List[T] = nextLayer match {
 case Nil => accum.reverse.flatten
 case _ => bfsLoop(nextLayer.map(_.value) :: accum, nextLayer.flatMap(_.childrenLeftRight))
 }
 bfsLoop(List[List[T]](), List(tree))
 }
 val tree1 = Node[Int](6, Some(Node(13, Some(terminalNode(101)), None)), Some(Node(42, Some(terminalNode(666)), Some(terminalNode(65)))))
 println("map: " + tree1.map(i => s"Hello$i"))
 println("dfs: " + dfs(tree1))
 println("bfs: " + bfs(tree1))
}

I also put this code for a separate codereview after posting it as an answer.

As pointed out by @Bob Dalgleish, you mix mutable/immutable. You also mix pattern matching (enQueueNext) with if/else (bfs_visit). You also mix camel case notation (enQueueNext) with underscore notation (bfs_visit).

trait would be more appropriate for Tree than abstract class. You don't really need Tree, as I show in my example, but that is debatable. You don't really need a queue either.

You can make very succinct code with Scala. In my example below, the recursive BFS algorithm is basically a single line: bfsLoop(nextLayer.map(_.value) :: accum, nextLayer.flatMap(_.childrenLeftRight)).

object TreeTraversal extends App {
 case class Node[+T](value: T, left: Option[Node[T]], right: Option[Node[T]]) {
 def map[V](f: T => V): Node[V] = 
 Node(f(value), left.map(l => l.map(f)), right.map(r => r.map(f)))
 def childrenLeftRight: List[Node[T]] = List(left, right).flatten
 }
 def terminalNode[T](value: T) = Node(value, None, None)
 def dfs[T](tree: Node[T]): List[T] = {
 var output = List[T]()
 tree.map(t => (output = t :: output))
 output.reverse
 }
 def bfs[T](tree: Node[T]): List[T] = {
 @tailrec
 def bfsLoop(accum: List[List[T]], nextLayer: List[Node[T]]): List[T] = nextLayer match {
 case Nil => accum.reverse.flatten
 case _ => bfsLoop(nextLayer.map(_.value) :: accum, nextLayer.flatMap(_.childrenLeftRight))
 }
 bfsLoop(List[List[T]](), List(tree))
 }
 val tree1 = Node[Int](6, Some(Node(13, Some(terminalNode(101)), None)), Some(Node(42, Some(terminalNode(666)), Some(terminalNode(65)))))
 println("map: " + tree1.map(i => s"Hello$i"))
 println("dfs: " + dfs(tree1))
 println("bfs: " + bfs(tree1))
}

I also put this code for a separate codereview after posting it as an answer.

added 10 characters in body
Source Link
toto2
  • 5.5k
  • 17
  • 21

As pointed out by @Bob Dalgleish, you mix mutable/immutable. You also mix pattern matching (enQueueNext) with if/else (bfs_visit). You also mix camel case notation (enQueueNext) with underscore notation (bfs_visit).

trait would be more appropriate for Tree than abstract class. You don't really need Tree, as I show in my example, but that is debatable. You don't really need a queue either.

You can make very succinct code with Scala. In my example below, the recursive BFS algorithm is basically a single line: bfsLoop(nextLayer.map(_.value) :: accum, nextLayer.flatMap(_.childrenLeftRight)).

object BFSTreeTraversal extends App {
 case class Node[+T](value: T, left: Option[Node[T]], right: Option[Node[T]]) {
 def map[V](f: T => V): Node[V] = 
 Node(f(value), left.map(l => l.map(f)), right.map(r => r.map(f)))
 def childrenLeftRight: List[Node[T]] = List(left, right).flatten
 }
 def terminalNode[T](value: T) = Node(value, None, None)
 def dfs[T](tree: Node[T]): List[T] = {
 var output = List[T]()
 tree.map(t => (output = t :: output))
 output.reverse
 }
 def bfs[T](tree: Node[T]): List[T] = {
 @tailrec
 def bfsLoop(accum: List[List[T]], nextLayer: List[Node[T]]): List[T] = nextLayer match {
 case Nil => accum.reverse.flatten
 case _ => bfsLoop(nextLayer.map(_.value) :: accum, nextLayer.flatMap(_.childrenLeftRight))
 }
 bfsLoop(List[List[T]](), List(tree))
 }
 val tree1 = Node[Int](6, Some(Node(13, Some(terminalNode(101)), None)), Some(Node(42, Some(terminalNode(666)), Some(terminalNode(65)))))
 println("map: " + tree1.map(i => s"Hello$i"))
 println("dfs: " + dfs(tree1))
 println("bfs: " + bfs(tree1))
}

I also put this code for a separate codereview after posting it as an answer.

As pointed out by @Bob Dalgleish, you mix mutable/immutable. You also mix pattern matching (enQueueNext) with if/else (bfs_visit). You also mix camel case notation (enQueueNext) with underscore notation (bfs_visit).

trait would be more appropriate for Tree than abstract class. You don't really need Tree, as I show in my example, but that is debatable. You don't really need a queue either.

You can make very succinct code with Scala. In my example below, the recursive BFS algorithm is basically a single line: bfsLoop(nextLayer.map(_.value) :: accum, nextLayer.flatMap(_.childrenLeftRight)).

object BFS extends App {
 case class Node[+T](value: T, left: Option[Node[T]], right: Option[Node[T]]) {
 def map[V](f: T => V): Node[V] = 
 Node(f(value), left.map(l => l.map(f)), right.map(r => r.map(f)))
 def childrenLeftRight: List[Node[T]] = List(left, right).flatten
 }
 def terminalNode[T](value: T) = Node(value, None, None)
 def dfs[T](tree: Node[T]): List[T] = {
 var output = List[T]()
 tree.map(t => (output = t :: output))
 output.reverse
 }
 def bfs[T](tree: Node[T]): List[T] = {
 @tailrec
 def bfsLoop(accum: List[List[T]], nextLayer: List[Node[T]]): List[T] = nextLayer match {
 case Nil => accum.reverse.flatten
 case _ => bfsLoop(nextLayer.map(_.value) :: accum, nextLayer.flatMap(_.childrenLeftRight))
 }
 bfsLoop(List[List[T]](), List(tree))
 }
 val tree1 = Node[Int](6, Some(Node(13, Some(terminalNode(101)), None)), Some(Node(42, Some(terminalNode(666)), Some(terminalNode(65)))))
 println("map: " + tree1.map(i => s"Hello$i"))
 println("dfs: " + dfs(tree1))
 println("bfs: " + bfs(tree1))
}

I also put this code for a separate codereview after posting it as an answer.

As pointed out by @Bob Dalgleish, you mix mutable/immutable. You also mix pattern matching (enQueueNext) with if/else (bfs_visit). You also mix camel case notation (enQueueNext) with underscore notation (bfs_visit).

trait would be more appropriate for Tree than abstract class. You don't really need Tree, as I show in my example, but that is debatable. You don't really need a queue either.

You can make very succinct code with Scala. In my example below, the recursive BFS algorithm is basically a single line: bfsLoop(nextLayer.map(_.value) :: accum, nextLayer.flatMap(_.childrenLeftRight)).

object TreeTraversal extends App {
 case class Node[+T](value: T, left: Option[Node[T]], right: Option[Node[T]]) {
 def map[V](f: T => V): Node[V] = 
 Node(f(value), left.map(l => l.map(f)), right.map(r => r.map(f)))
 def childrenLeftRight: List[Node[T]] = List(left, right).flatten
 }
 def terminalNode[T](value: T) = Node(value, None, None)
 def dfs[T](tree: Node[T]): List[T] = {
 var output = List[T]()
 tree.map(t => (output = t :: output))
 output.reverse
 }
 def bfs[T](tree: Node[T]): List[T] = {
 @tailrec
 def bfsLoop(accum: List[List[T]], nextLayer: List[Node[T]]): List[T] = nextLayer match {
 case Nil => accum.reverse.flatten
 case _ => bfsLoop(nextLayer.map(_.value) :: accum, nextLayer.flatMap(_.childrenLeftRight))
 }
 bfsLoop(List[List[T]](), List(tree))
 }
 val tree1 = Node[Int](6, Some(Node(13, Some(terminalNode(101)), None)), Some(Node(42, Some(terminalNode(666)), Some(terminalNode(65)))))
 println("map: " + tree1.map(i => s"Hello$i"))
 println("dfs: " + dfs(tree1))
 println("bfs: " + bfs(tree1))
}

I also put this code for a separate codereview after posting it as an answer.

added 222 characters in body
Source Link
toto2
  • 5.5k
  • 17
  • 21

As pointed out by @Bob Dalgleish, you mix mutable/immutable. You also mix pattern matching (enQueueNext) with if/else (bfs_visit). You also mix camel case notation (enQueueNext) with underscore notation (bfs_visit).

trait would be more appropriate for Tree than abstract class. You don't really need Tree, as I show in my example, but that is debatable. You don't really need a queue either.

You can make very succinct code with Scala. In my example below, the recursive BFS algorithm is basically a single line: bfsLoop(nextLayer.map(_.value) :: accum, nextLayer.flatMap(_.childrenLeftRight)).

object BFS extends App {
 case class Node[+T](value: T, left: Option[Node[T]], right: Option[Node[T]]) {
 def map[V](f: T => V): Node[V] = 
 Node(f(value), left.map(l => l.map(f)), right.map(r => r.map(f)))
 def childrenLeftRight: List[Node[T]] = List(left, right).flatten
 }
 def terminalNode[T](value: T) = Node(value, None, None)
 def dfs[T](tree: Node[T]): List[T] = {
 var output = List[T]()
 tree.map(t => (output = t :: output))
 output.reverse
 }
 def bfs[T](tree: Node[T]): List[T] = {
 @tailrec
 def bfsLoop(accum: List[List[T]], nextLayer: List[Node[T]]): List[T] = nextLayer match {
 case Nil => accum.reverse.flatten
 case _ => bfsLoop(nextLayer.map(_.value) :: accum, nextLayer.flatMap(_.childrenLeftRight))
 }
 bfsLoop(List[List[T]](), List(tree))
 }
 val tree1 = Node[Int](6, Some(Node(13, Some(terminalNode(101)), None)), Some(Node(42, Some(terminalNode(666)), Some(terminalNode(65)))))
 println("map: " + tree1.map(i => s"Hello$i"))
 println("dfs: " + dfs(tree1))
 println("bfs: " + bfs(tree1))
}

I also put this code for a separate codereview after posting it as an answer.

As pointed out by @Bob Dalgleish, you mix mutable/immutable. You also mix pattern matching (enQueueNext) with if/else (bfs_visit). You also mix camel case notation (enQueueNext) with underscore notation (bfs_visit).

trait would be more appropriate for Tree than abstract class. You don't really need Tree, as I show in my example, but that is debatable. You don't really need a queue either.

object BFS extends App {
 case class Node[+T](value: T, left: Option[Node[T]], right: Option[Node[T]]) {
 def map[V](f: T => V): Node[V] = 
 Node(f(value), left.map(l => l.map(f)), right.map(r => r.map(f)))
 def childrenLeftRight: List[Node[T]] = List(left, right).flatten
 }
 def terminalNode[T](value: T) = Node(value, None, None)
 def dfs[T](tree: Node[T]): List[T] = {
 var output = List[T]()
 tree.map(t => (output = t :: output))
 output.reverse
 }
 def bfs[T](tree: Node[T]): List[T] = {
 @tailrec
 def bfsLoop(accum: List[List[T]], nextLayer: List[Node[T]]): List[T] = nextLayer match {
 case Nil => accum.reverse.flatten
 case _ => bfsLoop(nextLayer.map(_.value) :: accum, nextLayer.flatMap(_.childrenLeftRight))
 }
 bfsLoop(List[List[T]](), List(tree))
 }
 val tree1 = Node[Int](6, Some(Node(13, Some(terminalNode(101)), None)), Some(Node(42, Some(terminalNode(666)), Some(terminalNode(65)))))
 println("map: " + tree1.map(i => s"Hello$i"))
 println("dfs: " + dfs(tree1))
 println("bfs: " + bfs(tree1))
}

I also put this code for a separate codereview after posting it as an answer.

As pointed out by @Bob Dalgleish, you mix mutable/immutable. You also mix pattern matching (enQueueNext) with if/else (bfs_visit). You also mix camel case notation (enQueueNext) with underscore notation (bfs_visit).

trait would be more appropriate for Tree than abstract class. You don't really need Tree, as I show in my example, but that is debatable. You don't really need a queue either.

You can make very succinct code with Scala. In my example below, the recursive BFS algorithm is basically a single line: bfsLoop(nextLayer.map(_.value) :: accum, nextLayer.flatMap(_.childrenLeftRight)).

object BFS extends App {
 case class Node[+T](value: T, left: Option[Node[T]], right: Option[Node[T]]) {
 def map[V](f: T => V): Node[V] = 
 Node(f(value), left.map(l => l.map(f)), right.map(r => r.map(f)))
 def childrenLeftRight: List[Node[T]] = List(left, right).flatten
 }
 def terminalNode[T](value: T) = Node(value, None, None)
 def dfs[T](tree: Node[T]): List[T] = {
 var output = List[T]()
 tree.map(t => (output = t :: output))
 output.reverse
 }
 def bfs[T](tree: Node[T]): List[T] = {
 @tailrec
 def bfsLoop(accum: List[List[T]], nextLayer: List[Node[T]]): List[T] = nextLayer match {
 case Nil => accum.reverse.flatten
 case _ => bfsLoop(nextLayer.map(_.value) :: accum, nextLayer.flatMap(_.childrenLeftRight))
 }
 bfsLoop(List[List[T]](), List(tree))
 }
 val tree1 = Node[Int](6, Some(Node(13, Some(terminalNode(101)), None)), Some(Node(42, Some(terminalNode(666)), Some(terminalNode(65)))))
 println("map: " + tree1.map(i => s"Hello$i"))
 println("dfs: " + dfs(tree1))
 println("bfs: " + bfs(tree1))
}

I also put this code for a separate codereview after posting it as an answer.

added 136 characters in body
Source Link
toto2
  • 5.5k
  • 17
  • 21
Loading
Source Link
toto2
  • 5.5k
  • 17
  • 21
Loading
lang-scala

AltStyle によって変換されたページ (->オリジナル) /