算法系列-树

78 阅读2分钟

是一种分层的数据模型。前端常见的树包括:DOM、树、级联选择、树形控件……。JavaScript中没有,但是可以通过ObjectArray构建。树的常用操作:深度/广度优先遍历、先中后序遍历。

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 题目