本例中节点权结构图
1. Kotlin 中二叉树的创建
简单二叉树的创建分为三部分: 新建节点、新建树、给节点和树赋值并关联,下面进入编码阶段:
1.1 新建节点 Bean:TreeNode.kt
注意:在 Kotlin 中使用 data class 声明类时,可以直接创建一个包含 getters、 setters、 equals()、 hashCode()、 toString() 以及 copy() 的 POJO,大大减少了样板代码数量,这是 Kotlin 的一大特色!
代码语言:javascript复制/**
* @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 ↑
代码语言:javascript复制/**
* @des 链式存储二叉树Bean
* @author liyongli 20190215
*
* @param rootNode : 二叉树的根节点
* */
data class BianryTree(var rootNode:TreeNode) {}
1.3 声明节点对象、树对象并赋值
代码语言:javascript复制 // 创建第二、三层节点(为了效率,第三层以具名参数形式赋值)
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)
代码语言:javascript复制/**
* @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)
代码语言:javascript复制/**
* @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)
代码语言:javascript复制/**
* @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
}
}
本篇到此完结,如有补充内容随时更新!欢迎关注本人继续跟进技术干货的更新!