「原來 Tree 的應用範圍比我想像的還要廣啊!」我忍不住感嘆。
「當然囉。」後面有個聲音回應我:「那你知道 BFS 和 DFS,分別對應 Queue 和 Stack 嗎?」
這種明顯用來呼應前面內容的題目——我一轉頭,果然又是那個小孩。
「別小看我啊!」我挺起胸膛。「Queue 是順著來,Stack 是逆著走。DFS 會一路往下到底,再回頭倒退找,當然就是 Stack;而 BFS 是一層層排隊找,對應 Queue!」
「嘖——真無聊,被你秒答了。」孩子撇撇嘴。
我得意一笑:「就算你要我直接實作 Tree 的程式碼,我也沒問題!」
「哦?這可是你自己說的喔。」小孩狡黠一笑,手指輕輕一揮,半透明的程式碼像全息投影一樣懸浮在空中。
// 節點定義
class TreeNode<T : Comparable<T>>(val value: T) {
var left: TreeNode<T>? = null
var right: TreeNode<T>? = null
}
// 二元搜尋樹 (Binary Search Tree)
class BinarySearchTree<T : Comparable<T>> {
var root: TreeNode<T>? = null
// 插入新值
fun insert(value: T) {
//todo
}
private fun insertRec(node: TreeNode<T>?, value: T): TreeNode<T> {
//todo
return node
}
// 深度優先搜尋 (DFS)
fun inorderTraversal(node: TreeNode<T>? = root) {
//todo
}
// 廣度優先搜尋 (BFS)
fun levelOrderTraversal() {
//todo
}
}
「等一下,這裡的 Comparable 是什麼意思?」我指著程式碼問。
「啊,那是因為插入和搜尋的時候,都要比較大小嘛。」小孩晃著腦袋解釋道。「用 Comparable 就能保證節點裡放的東西能夠比較。例如整數、浮點數,甚至字串都行。只要有定義大小關係,就能丟進來用。」
「原來可以這樣做啊!」我恍然大悟地點點頭,覺得這設計還真是巧妙,不管其他,只要知道能比較就夠了。