本例中節點權結構圖編程
遍歷代碼運行結果圖bash
簡單二叉樹的建立分爲三部分: 新建節點、新建樹、給節點和樹賦值並關聯,下面進入編碼階段:app
注意:在 Kotlin 中使用 data class 聲明類時,能夠直接建立一個包含 getters、 setters、 equals()、 hashCode()、 toString() 以及 copy() 的 POJO,大大減小了樣板代碼數量,這是 Kotlin 的一大特點!ide
/**
* @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) {}
複製代碼
只需聲明一個根節點對象 rootNode,一樣的使用 data class 聲明類的類型,這樣無需編寫 getters、setters 樣板代碼,代碼簡潔度及編程效率確實大大的 up ↑ui
/**
* @des 鏈式存儲二叉樹Bean
* @author liyongli 20190215
*
* @param rootNode : 二叉樹的根節點
* */
data class BianryTree(var rootNode:TreeNode) {}
複製代碼
// 建立第2、三層節點(爲了效率,第三層以具名參數形式賦值)
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)
複製代碼
經常使用的二叉樹遍歷方式分爲三種:前序遍歷、中序遍歷、後序遍歷,摸清規律後三種方式便可輕鬆掌握!編碼
/**
* 前序遍歷遞歸
*/
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() + " ")
}
複製代碼
提醒:聰明的你是否發現了規律?spa
/**
* @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() + " ")
}
}
複製代碼
/**
* @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()
}
}
複製代碼
/**
* @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)
// 建立第2、三層節點(爲了效率,第三層以具名參數形式賦值)
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
}
}
複製代碼
本篇到此完結,若有補充內容隨時更新!歡迎關注本人繼續跟進技術乾貨的更新!code