本例中節點權結構圖
遍歷代碼運行結果圖
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 } }
本篇到此完結,如有補充內容隨時更新!歡迎關注本人繼續跟進技術乾貨的更新!