我想在Scala中製作一個非常簡單的二叉樹用於數據存儲和遍歷。在Scala中製作一個非常基本的二叉樹
現在我有:
trait Tree
case class Node(left: Tree, value: String, right: Tree) extends Tree
我的問題:
我怎麼能還包括一個指向父?
我能以任何方式將左右指向爲空嗎?或者是根節點的父指針?
我該如何遍歷樹?
是否容易更新節點的值?
我想在Scala中製作一個非常簡單的二叉樹用於數據存儲和遍歷。在Scala中製作一個非常基本的二叉樹
現在我有:
trait Tree
case class Node(left: Tree, value: String, right: Tree) extends Tree
我的問題:
我怎麼能還包括一個指向父?
我能以任何方式將左右指向爲空嗎?或者是根節點的父指針?
我該如何遍歷樹?
是否容易更新節點的值?
不能與不變的情況下類。這是一種循環依賴:您需要父級創建子級,但您還需要子級創建父級。另一方面,大多數樹遍歷算法並不需要父對象,因爲父對象通常在堆棧中,或者可以存儲在某個地方。
是的,我們通常有一個特徵的單一實例(object
)表示這些:
case object EmptyNode extends Tree
有很多的算法在那裏,廣度優先搜索和深度優先搜索是最常見的。實施它們是一項很好的練習。但在斯卡拉側一點幫助的left
和right
,我們通常模式匹配,看看我們下一步需要做:
tree: Tree match {
case EmptyNode => // do nothing, return, etc.
case Node(left, value, right) =>
// Do inorder, preorder, postorder operation order
// You will also probably be processing left and right as well
}
不,你的猜測是正確的,在樹上用不變的情況下,類很難更新,因爲如果你更新葉節點,那麼你必須重新創建它上面的所有東西。有所謂的鏡頭和鏡頭庫,可以幫助你,雖然他們可能會更先進一些。在Scala中流行的一個是Monocle。
好像你只是用編程或新斯卡拉開始,所以我會建議使用var
-s代替val
S:
case class Node(var left: Tree, var value: String, var right: Tree) extends Tree
此外,如果你的特質是密封的( sealed trait Tree
),那麼編譯器會告訴你,如果你沒有在模式匹配中處理其中一個子類型。
編輯:
基礎上的評論開始這方面的工作:
sealed trait Tree
case class Node(var left: Tree, var value: String, var right: Tree, var parent: Tree) extends Tree
case object EmptyNode extends Tree
如果它是一個需要二叉樹設施的程序員有用的,我寫了一些Scala的特性,可以被繼承和/或混合以提供基本的紅黑樹功能以及一些其他基於樹的算法:
是的,默認情況下,當你定義'節點',然後'左','價值','右'都被定義爲'val'-s,這意味着你不能更新它們。如果你想要mutable,那麼就在我面前寫下'var',就像我在答案的最後部分所做的那樣。之後,您可以隨時更新屬性。 –
是的,看起來不錯,編譯!祝你好運! (更新:也許在'trait Tree'前面加上'sealed',正如我提到的那樣,編譯器會幫助你並且爲你找到bug)。 –
現在,如果我想添加一個孩子到目前爲止,我做myTree.left =節點(無論)? – user4992519