Kotlin 鏈式儲存的二叉樹的建立、遍歷

MobMsg發表於2019-02-18

本例中節點權結構圖

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 鏈式儲存的二叉樹的建立、遍歷

相關文章