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为安卓方法,其他平台自行替换打印内容即可

发布了28 篇原创文章 · 获赞 49 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qwe25878/article/details/89714084
今日推荐