引言
今天,用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爲安卓方法,其他平臺自行替換打印內容即可