专业的编程技术博客社区

网站首页 > 博客文章 正文

Kotlin遇见数据结构丨说说链式存储的二叉树如何创建遍历

baijin 2024-09-06 14:53:14 博客文章 5 ℃ 0 评论

本例中节点权结构图



遍历代码运行结果图


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

 }
}

本篇到此完结,如有补充内容随时更新!欢迎关注本人继续跟进技术干货的更新!

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表