内容简介:简单二叉树的创建分为三部分:注意:在 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() + " ")
}
复制代码
提醒:聪明的你是否发现了规律?
贴上三个类的完整代码
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
}
}
复制代码
本篇到此完结,如有补充内容随时更新!欢迎关注本人继续跟进技术干货的更新!
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 数组常见的遍历循环方法、数组的循环遍历的效率对比
- C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——遍历和删除
- Js遍历数组总结
- 遍历
- 遍历 DOM 注意点
- MySQL 实现树形的遍历
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Web 2.0 Architectures
Duane Nickull、Dion Hinchcliffe、James Governor / O'Reilly / 2009 / USD 34.99
The "Web 2.0" phenomena has become more pervasive than ever before. It is impacting the very fabric of our society and presents opportunities for those with knowledge. The individuals who understand t......一起来看看 《Web 2.0 Architectures》 这本书的介绍吧!