内容简介:简单二叉树的创建分为三部分:注意:在 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 实现树形的遍历
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
iPhone开发实战
2009-10 / 69.00元
《iPhone开发实战》全面探讨了iPhone平台的两种编程方式——Web开发和SDK编程。全书结合示例对这两种编程方式的基本流程、基本原理和基本原则给出了详细而通俗的讲解。在Web开发方面,分别介绍了三个iPhone Web库,即WebKit、iUI和Canvas,并讨论了Web开发环境Dashcode,最后阐述Web应用程序的调试。在SDK开发方面,详细描述其各种组件和功能,包括Xcode、I......一起来看看 《iPhone开发实战》 这本书的介绍吧!
XML、JSON 在线转换
在线XML、JSON转换工具
HSV CMYK 转换工具
HSV CMYK互换工具