https://gitee.com/thinkerwing/study/tree/master/%E9%9D%A2%E8%AF%95%E9%A2%98/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/%E6%A0%91
树是什么?
- 树是一种分层数据的抽象模型
- 前端工作中常见的树包括:DOM树、级联选择、树形控件
- JS中没有树,但是可以用Object和Array构建树。
- 树的常用操作:深度/广度优先遍历、先中后序遍历。
什么是深度/广度优先遍历?
深度优先就像翻书,先看第一章,再看第一章的小结,看完看第二章。
广度优先就像看目录,看一下有哪儿几章,再看里面的内容
深度优先遍历算法口诀
访问根节点。
对根节点的children诶个进行深度优先遍历。
const tree = {
val: 'a',
children:[
{
val:'b',
children:[
{
val:'d',
children:[]
},
{
val:'e',
children:[]
}
]
},
{
val:'c',
children:[
{
val:'f',
children:[]
},
{
val:'g',
children:[]
}
]
}
]
}
const dfs = (root) => {
console.log(root.val);
root.children.forEach(dfs)
}
dfs(tree)
广度优先遍历算法口诀
- 新建一个队列,把根节点入队
- 把队头出队并访问
- 把队头的children诶个入队
- 重复第二、三步,直到队列为空
const bfs = (root) => {
const q = [root]
while(q.length>0) {
const n = q.shift()
console.log(n.val);
n.children.forEach(child => {
q.push(child)
})
}
}
bfs(tree)
二叉树的先中后序遍历
二叉树是什么?
- 树中每个节点最多只能有两个子节点
- 在JS中通常用Object来模拟二叉树
const bt = require('./bt');
const preorder = (root) => {
if (!root) { return; }
console.log(root.val);
preorder(root.left);
preorder(root.right);
}
preorder(bt);
const bt = require('./bt');
const inorder = (root) => {
if(!root) {return;}
inorder(root.left);
console.log(root.val);
inorder(root.right);
}
inorder(bt);
const bt = require('./bt');
const postorder = (root) => {
if (!root) { return; }
postorder(root.left);
postorder(root.right);
console.log(root.val);
};
postorder(bt);