Kotlin實現二叉樹的深度遍歷和廣度遍歷

引言

今天,用kotlin打造一個二叉樹,也是練手級別小製作,希望大家喜歡。

涉及知識點

數據結構知識

  • 隊列
  • 二叉樹
  • 樹的廣度遍歷
  • 樹的深度遍歷

kotlin知識

  • Lambda
  • object
  • when
  • 非空斷言
  • data class

節點類

data class TreeNode(var value: Int, var leftChild: TreeNode? = null, var rightChild: TreeNode? = null)

二叉樹類

這裏只寫了添加和遍歷。
添加採用了平衡二叉樹的思想,左孩子小於父節點,右孩子大於父節點

class BinaryTree {
    var root: TreeNode? = null
	//添加
    fun insert(value: Int) {
        val newNode = TreeNode(value)
        when (root) {
            null -> root = newNode
            else -> {
                var currentNode: TreeNode? = root
                var parentNode: TreeNode

                while (true) {
                    parentNode = currentNode!!
                    when {
                        newNode.value > currentNode.value -> {
                            currentNode = currentNode.rightChild
                            if (currentNode == null) {
                                parentNode.rightChild = newNode
                                return
                            }
                        }
                        else -> {
                            currentNode = currentNode.leftChild
                            if (currentNode == null) {
                                parentNode.leftChild = newNode
                                return
                            }
                        }
                    }
                }
            }
        }
    }
    //深度遍歷
    fun inOrderDepth(treeNode: TreeNode?) {
        if (treeNode != null) {
            Log.d("asdasd", "前序遍歷:" + treeNode.value.toString())
            inOrderDepth(treeNode.leftChild)
            Log.d("qweqwe", "中序遍歷:" + treeNode.value.toString())
            inOrderDepth(treeNode.rightChild)
            Log.d("zxczxc", "後序遍歷:" + treeNode.value.toString())
        }
    }
    //廣度遍歷
    fun inOrderWidth(treeNode: TreeNode?) {
        if (treeNode == null)
            return
        val nodelist = ArrayList<TreeNode>()
        nodelist.add(treeNode)
        while (nodelist.size > 0) {
            val rnode = nodelist[0];
            nodelist.remove(rnode)
            Log.d("qazqaz", "廣度遍歷" + rnode.value.toString())
            rnode.leftChild?.let { nodelist.add(it) }
            rnode.rightChild?.let { nodelist.add(it) }
        }
    }
}

測試類

object TreeTest {
    var binaryTree = BinaryTree()

    fun addAtree() {
        binaryTree.insert(10)
        binaryTree.insert(3)
        binaryTree.insert(8)
        binaryTree.insert(5)
        binaryTree.insert(100)
        binaryTree.insert(20)
        binaryTree.insert(50)
    }

    fun order() {
        binaryTree.inOrderDepth(binaryTree.root)
        binaryTree.inOrderWidth(binaryTree.root)
    }
}

找個主函數調用下

TreeTest.addAtree()
TreeTest.order()

即可。
Log.d爲安卓方法,其他平臺自行替換打印內容即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章