树的介绍
树是一种有序的层级结构,每个节点下面可以由若干个子节点,例如常见的DOM树
树节点的数据结构
interface ITreeNode {
data: any
children: ITreeNode[] | null
}
二叉树 Binary Tree
二叉树,首先它是一棵树,其次它的每个节点,最多有两个子节点,分别为 left 和 right
二叉树的遍历
前序遍历 root left right
中序遍历 left root right
后序遍历 left right root
interface ITreeNode{
value:number
left:ITreeNode | null
right:ITreeNode | null
}
const tree:ITreeNode = {
value:5,
left:{
value:3,
left:{
value:2,
left:null,
right:null
},
right:{
value:4,
left:null,right:null
}
},
right:{
value:7,
left:{
value:6,
left:null,
right:null
},
right:{
value:8,
left:null,
right:null
}
}
}
//前序遍历
function preOrderTraverse(node:ITreeNode){
if(node===null) return
console.log(node.value)
preOrderTraverse(node.left)
preOrderTraverse(node.right)
}
//中序遍历
function inOrderTraverse(node:ITreeNode){
if(node===null) return
inOrderTraverse(node.left)
console.log(node.value)
inOrderTraverse(node.right)
}
//后序遍历
function postOrderTraverse(node:ITreeNode){
if(node===null) return
postOrderTraverse(node.left)
postOrderTraverse(node.right)
console.log(node.value)
}
二叉树节点的数据结构
interface IBinaryTreeNode {
data: any
left: IBinaryTreeNode | null
right: IBinaryTreeNode | null
}
性能
数组:查找快O(1) 增删慢O(n)
链表:查找慢O(n),增删快O(1)
二叉搜索树 BST:查询快 增删快 - “木桶效应”
二叉搜索树
left 包括后代 value<=root value
right 包括后代 value<=root value
平衡二叉搜索树BBST
BST如果不平衡,那就又成链表了
所有要尽量平衡:平衡二叉搜索树BBST
BBST增删改查,时间复杂度都是O(logn),即树的高度
红黑树
一种自平衡二叉树
分成红/黑两种颜色,通过颜色转换来维持树的平衡
低成本快速保持平衡
相对于普通平衡二叉树,它维持平衡效率更高一些
B树
物理上是多叉树,逻辑上是二叉树
一般用于高效I/O,关系型数据库常用B树来组织数据
根据树的特性用来求二叉搜索树的第K小值
/**
* 可以用二分法进行快速查找
* 中序遍历:从小到大排序
*/
const arr:number[]=[]
interface ITreeNode{
value:number
left:ITreeNode | null
right:ITreeNode | null
}
const bst:ITreeNode = {
value:5,
left:{
value:3,
left:{
value:2,
left:null,
right:null
},
right:{
value:4,
left:null,right:null
}
},
right:{
value:7,
left:{
value:6,
left:null,
right:null
},
right:{
value:8,
left:null,
right:null
}
}
}
//中序遍历
function inOrderTraverse(node:ITreeNode){
if(node===null) return
inOrderTraverse(node.left)
arr.push(node.value)
inOrderTraverse(node.right)
}
function getKthValue(node:ITreeNode,k:number):number | null{
inOrderTraverse(node)
return arr[k-1] || null
}