什么是树 - tree
一种分层数据的抽象模型;
如:DOM、级联选择、树形控件,js 中没有树
可以用 Object
构建树:
const tree = {val: 'a',children: [{val: 'a-1',children: [{val: 'a-1-1',children: []}]},{val: 'a-2',children: [{val: 'a-2-1',children: []}]}]
}
深度优先遍历: 尽可能深的搜索树的分支,即 children 递归
实现:
const dfs = root => {console.log(root.val) // a a-1 a-1-1 a-2 a-2-1root.children.forEach(e => {dfs(e)})
}
dfs(tree)
广度优先遍历: 先访问离根节点最近的节点
实现:
const bfs = root => {const q = [root] // 队列while (q.length) {const p = q.shift() // 队头出队、删除第一项(返回第一项)console.log(p.val) // a a-1 a-2 a-1-1 a-2-1p.children.forEach(e => {q.push(e)})}
}
bfs(tree)
二叉树
树中的节点最多只能有两个子节点;
使用 JS 模拟二叉树结构:
const tree = {val: 'a',left: {val: 'a-left',left: { val: 'a-left-left', left: null, right: null },right: { val: 'a-left-right', left: null, right: null }},right: {val: 'a-right',left: { val: 'a-right-left', left: null, right: null },right: { val: 'a-right-right', left: null, right: null }}
}
先序遍历:
访问根节点、对根节点的左子树先序先序遍历、对根节点的右子树进行先序遍历;
输出顺序:a、a-left、a-left-left、a-left-right、a-right、a-right-left、a-right-right
const preOrder = root => {if (!root) returnconsole.log(root.val)preOrder(root.left)preOrder(root.right)
}
preOrder(tree)
中序遍历:
对根节点左子树进行中序遍历、访问根节点、对根节点的右子树进行中序遍历;
输出顺序:a-left-left、a-left、a-left-right、a、a-right-left、a-right、a-right-right
const inOrder = root => {if (!root) returninOrder(root.left)console.log(root.val)inOrder(root.right)
}
inOrder(tree)
后序遍历:
根节点左子树进行后序遍历、根节点右子树进行后续遍历、访问根节点
输出顺序:a-left-left、a-left-right、a-left、a-right-left、a-right-right、a-right、a
const postOrder = root => {if (!root) returninOrder(root.left)inOrder(root.right)console.log(root.val)
}
inOrder(tree)