Kotlinは二叉樹の深さ遍歴と広さ遍歴を実現します.

3146 ワード

ことばを引く
今日は、kotlinで二叉の木を作って、トレーナーレベルの小さい制作です.皆さんが好きなように.
知識に触れる
データ構造の知識
  • 二叉木
  • ツリーの広さは
  • を遍歴しています.
  • ツリーの深さは
  • を巡回します.
    コーツリン知識
  • Lambada
  • 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()
            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はAndroidの方法で、他のプラットフォームは自分で印刷内容を交替すればいいです.