树的查找性能和插入性能优于线性结构(数组、链表)。
二叉树:任何节点的子节点数量不超过2
二叉树的子节点分为左节点和右节点。
下图是两棵树
满二叉树:所有叶子节点都在最后一层,而且节点总
数为2^n-1。
完全二叉树:所有叶子节点都在最后一层或倒数第二层,且最后一层的叶子节点都在左边连续,倒数第二层的叶子节点在右边连续。
下图不是完全二叉树,第4层的叶子节点不是从左至右
下图也不是完全二叉树,第3层右边的叶子结点没有填满。
创建二叉树
-------1
----2----3
代码
(1)创建树类:
class BinaryTree() {
var root: TreeNode ?= null
}
(2)创建节点类:
class TreeNode(var value: Int) {
var left: TreeNode ?= null
var right: TreeNode ?= null
}
(3)创建二叉树:
fun main() {
// 创建一棵空树
val binaryTree = BinaryTree()
// 创建一个根节点
val root = TreeNode(1)
// 把根节点赋给树
binaryTree.root = root
// 创建2个节点
val rootLeft = TreeNode(2)
val rootRight = TreeNode(3)
// 把跟节点赋给树
binaryTree.root?.left = rootLeft
binaryTree.root?.right = rootRight
}
遍历二叉树
上图的前序、中序、后序分别为:
前序(根左右):1,2,4,5 ,3,6,7
中序(左根右):4,2,5 ,1,6,3,7
后序(左右根):4,5,2 ,6,7,3 ,1
代码
fun main() {
// 创建一棵树
val binaryTree = BinaryTree()
// 第一层
// 创建一个根节点
val root = TreeNode(1)
// 把根节点赋给树
binaryTree.root = root
// 第二层
// 创建2个节点
val rootLeft = TreeNode(2)
val rootRight = TreeNode(3)
// 把跟节点赋给树
binaryTree.root?.left = rootLeft
binaryTree.root?.right = rootRight
// 第三层
// 为第二层的左节点创建2个节点
rootLeft.left = TreeNode(4)
rootLeft.right = TreeNode(5)
// 为第二层的右节点创建2个节点
rootRight.left = TreeNode(6)
rootRight.right = TreeNode(7)
print("前序遍历: ")
binaryTree.frontShow()
println<