Kotlin 链式存储的二叉树的创建、遍历

栏目: 数据库 · 发布时间: 6年前

内容简介:简单二叉树的创建分为三部分:注意:在 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 链式存储的二叉树的创建、遍历

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Web 2.0 Architectures

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》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具