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