本例中節點權結構圖
遍歷程式碼執行結果圖
1. Kotlin 中二叉樹的建立
簡單二叉樹的建立分為三部分: 新建節點、新建樹、給節點和樹賦值並關聯,下面進入編碼階段:
1.1 新建節點 Bean:TreeNode.kt
注意:在 Kotlin 中使用 data class 宣告類時,可以直接建立一個包含 getters、 setters、 equals()、 hashCode()、 toString() 以及 copy() 的 POJO,大大減少了樣板程式碼數量,這是 Kotlin 的一大特色!
/**
* @des 鏈式儲存節點Bean
* @author liyongli 20190215
*
* @param leftNode : 左子節點
* @param value : 節點的權
* @param rightNode : 右子節點
* */
data class TreeNode(var leftNode:TreeNode? = null, var value:Int?, var rightNode:TreeNode? = null) {}
複製程式碼
1.2 新建樹物件 Bean:BianryTree.kt
只需宣告一個根節點物件 rootNode,同樣的使用 data class 宣告類的型別,這樣無需編寫 getters、setters 樣板程式碼,程式碼簡潔度及程式設計效率確實大大的 up ↑
/**
* @des 鏈式儲存二叉樹Bean
* @author liyongli 20190215
*
* @param rootNode : 二叉樹的根節點
* */
data class BianryTree(var rootNode:TreeNode) {}
複製程式碼
1.3 宣告節點物件、樹物件並賦值
// 建立第二、三層節點(為了效率,第三層以具名引數形式賦值)
var leftNode:TreeNode = TreeNode(TreeNode(value = 4), 2, TreeNode(value = 5))
var rightNode:TreeNode = TreeNode(TreeNode(value = 6), 3, TreeNode(value = 7))
// 建立根節點並新增2個子節點
var rootNode:TreeNode = TreeNode(leftNode = leftNode, value = 1, rightNode = rightNode)
// 建立樹物件並新增根節點
var tree:BianryTree = BianryTree(rootNode = rootNode)
複製程式碼
2. Kotlin 中二叉樹的遍歷
常用的二叉樹遍歷方式分為三種:前序遍歷、中序遍歷、後序遍歷,摸清規律後三種方式即可輕鬆掌握!
2.1 前序遍歷
- 訪問根節點
- 前序遍歷左子樹
- 前序遍歷右子樹
/**
* 前序遍歷遞迴
*/
fun frontShow() {
// 根節點
BinaryTreeActivity.frontRestlt.append(value.toString() + " ")
// 左節點
leftNode?.frontShow()
// 右節點
rightNode?.frontShow()
}
複製程式碼
2.2 中序遍歷
- 中序遍歷左子樹
- 訪問根節點
- 中序遍歷右子樹
/**
* 中序遍歷遞迴
*/
fun midShow() {
// 左節點
leftNode?.midShow()
// 根節點
BinaryTreeActivity.midResult.append(value.toString() + " ")
// 右節點
rightNode?.midShow()
}
複製程式碼
2.3 後序遍歷
- 後序遍歷左子樹
- 後序遍歷右子樹
- 訪問根節點
/**
* 後續遍歷遞迴
*/
fun afterShow() {
// 左節點
leftNode?.afterShow()
// 右節點
rightNode?.afterShow()
// 根節點
BinaryTreeActivity.afterResult.append(value.toString() + " ")
}
複製程式碼
提醒:聰明的你是否發現了規律?
貼上三個類的完整程式碼
TreeNode.kt(節點 Bean)
/**
* @des 鏈式儲存節點Bean
* @author liyongli 20190215
*
* @param leftNode : 左子節點
* @param value : 節點的權
* @param rightNode : 右子節點
* */
data class TreeNode(var leftNode:TreeNode? = null, var value:Int?, var rightNode:TreeNode? = null) {
/**
* 前序遍歷遞迴
*/
fun frontShow() {
// 根節點
BinaryTreeActivity.frontRestlt.append(value.toString() + " ")
// 左節點
leftNode?.frontShow()
// 右節點
rightNode?.frontShow()
}
/**
* 中序遍歷遞迴
*/
fun midShow() {
// 左節點
leftNode?.midShow()
// 根節點
BinaryTreeActivity.midResult.append(value.toString() + " ")
// 右節點
rightNode?.midShow()
}
/**
* 後續遍歷遞迴
*/
fun afterShow() {
// 左節點
leftNode?.afterShow()
// 右節點
rightNode?.afterShow()
// 根節點
BinaryTreeActivity.afterResult.append(value.toString() + " ")
}
}
複製程式碼
BianryTree.kt(二叉樹 Bean)
/**
* @des 鏈式儲存二叉樹Bean
* @author liyongli 20190215
*
* @param rootNode : 二叉樹的根節點
* */
data class BianryTree(var rootNode:TreeNode) {
// 前序遍歷
fun frontShow() {
rootNode.frontShow()
}
// 中序遍歷
fun minShow() {
rootNode.midShow()
}
// 後續遍歷
fun afterShow() {
rootNode.afterShow()
}
}
複製程式碼
BinaryTreeActivity.kt(Activity)
/**
* @des 建立二叉樹並遍歷
* @author liyongli 20190215
* */
class BinaryTreeActivity : AppCompatActivity() {
companion object {
// 前序遍歷結果
var frontRestlt:StringBuffer = StringBuffer()
// 中序遍歷結果
var midResult:StringBuffer = StringBuffer()
// 後序遍歷結果
var afterResult:StringBuffer = StringBuffer()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_binary_tree)
// 建立第二、三層節點(為了效率,第三層以具名引數形式賦值)
var leftNode:TreeNode = TreeNode(TreeNode(value = 4), 2, TreeNode(value = 5))
var rightNode:TreeNode = TreeNode(TreeNode(value = 6), 3, TreeNode(value = 7))
// 建立根節點並新增2個子節點
var rootNode:TreeNode = TreeNode(leftNode = leftNode, value = 1, rightNode = rightNode)
// 建立樹物件並新增根節點
var tree:BianryTree = BianryTree(rootNode = rootNode)
// 前序遍歷
tree.frontShow()
frontTv.text = "前序遍歷:" + frontRestlt
// 中序遍歷
tree.minShow()
midTv.text = "中序遍歷:" + midResult
// 後序遍歷
tree.afterShow()
afterTv.text = "後序遍歷:" + afterResult
}
}
複製程式碼
本篇到此完結,如有補充內容隨時更新!歡迎關注本人繼續跟進技術乾貨的更新!