树
树是一种分层的数据模型。前端常见的树包括:DOM、树、级联选择、树形控件……。JavaScript中没有树,但是可以通过Object和Array构建树。树的常用操作:深度/广度优先遍历、先中后序遍历。
TS 实现
js
复制代码
/**
* 前序遍历:root -> left -> right
* 中序遍历:left -> root -> right
* 后序遍历:left -> right -> root
* 问1:为什么二叉树很重要,而不是三叉树、四叉树?
* 答:
* (1)数组、链表各有缺点
* (2)特定的二叉树(BBST,平衡二叉树)可以结合数组 & 链表的优点,让整体查找效果最优(可用二分法)
* (3)各种高级二叉树(红黑数、B树),继续优化,满足不同场景
* 问2:堆特点?和二叉树的关系?
* 答:
* (1)逻辑结构是一棵二叉树
* (2)物理结构是一个数组
* (3)数组:连续内存 + 节省空间
* (4)查询比 BST 慢
* (5)增删比 BST 快,维持平衡更快
* (6)整体时间复杂度都在 O(logn) 级别,与树一致
* @description 二叉搜索树
* @author hovinghuang
*/
interface ITreeNode {
value: number
left: ITreeNode | null
right: ITreeNode | null
}
const treeArr: number[] = []
/**
* 前序遍历
* @param node
* @returns
*/
function preOrderTraverse(node: ITreeNode | null): void {
if (node == null) return
console.info(node.value)
treeArr.push(node.value)
preOrderTraverse(node.left)
preOrderTraverse(node.right)
}
/**
* 中序遍历
* @param node
* @returns
*/
function inOrderTraverse(node: ITreeNode | null): void {
if (node == null) return
inOrderTraverse(node.left)
console.info(node.value)
treeArr.push(node.value)
inOrderTraverse(node.right)
}
/**
* 后序遍历
* @param node
* @returns
*/
function postOrderTraverse(node: ITreeNode | null): void {
if (node == null) return
postOrderTraverse(node.left)
postOrderTraverse(node.right)
console.info(node.value)
treeArr.push(node.value)
}
function getKthValue(node: ITreeNode, k: number): number | null {
inOrderTraverse(bst)
return treeArr[k - 1] || 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
}
}
}
// 功能测试
// preOrderTraverse(bst)
// inOrderTraverse(bst)
// postOrderTraverse(bst)
// console.info('第3小值', getKthValue(bst, 3))
使用场景
-
场景一:DOM 树
-
场景二:级联选择器
LeetCode 题目