Kotlin遇見數據結構丨說說鏈式存儲的二叉樹如何創建遍歷

本例中節點權結構圖


Kotlin遇見數據結構丨說說鏈式存儲的二叉樹如何創建遍歷


遍歷代碼運行結果圖

Kotlin遇見數據結構丨說說鏈式存儲的二叉樹如何創建遍歷

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() + " ")
 
 }

提醒:聰明的你是否發現了規律?


Kotlin遇見數據結構丨說說鏈式存儲的二叉樹如何創建遍歷

貼上三個類的完整代碼

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

 }
}

本篇到此完結,如有補充內容隨時更新!歡迎關注本人繼續跟進技術乾貨的更新!

Kotlin遇見數據結構丨說說鏈式存儲的二叉樹如何創建遍歷


分享到:


相關文章: