概念
先序:根节点 -> 左子树 -> 右子树
中序:左子树 -> 根节点 -> 右子树
后序:左子树 -> 右子树 -> 根节点
先序
遍历顺序
根节点
->左子树
->右子树
最终得到:A B D E C F
中序
遍历顺序
左子树
->根结点
->右子树
最终得到D B E A C F
后序
遍历顺序
左子树
->右子树
->根结点
最终得到D E B F C A
深度优先遍历(DFS
)
定义:
深度优先搜索每次以“深度
”为第一要务,一往无前
,会走出一条条完整的路径
实现 DFS – 递归
场景
const root = {
val: "A",
left: {
val: "B",
left: {
val: "D"
},
right: {
val: "E"
}
},
right: {
val: "C",
right: {
val: "F"
}
}
};
实现方案 - 递归
function DFS(root) {
// 递归边界,root 为空
if (!root) {
return
}
// 输出当前遍历的结点值
console.log('当前遍历的结点值是:', root.val)
// 递归遍历左子树
DFS(root.left)
// 递归遍历右子树
DFS(root.right)
}
DFS(root); // A B D E C F --- 与先序相同
广度优先遍历(BFS)
定义:
广度优先搜索每次以“广度
”为第一要务、雨露均沾,一层层扫描
,最后也能够将所有的坐标扫描完全
实现BFS - 队列
场景
const root = {
val: "A",
left: {
val: "B",
left: {
val: "D"
},
right: {
val: "E"
}
},
right: {
val: "C",
right: {
val: "F"
}
}
};
实现方案 - 队列
function BFS(root) {
const queue = [] // 初始化队列queue -- 先进先出
// 根结点首先入队
queue.push(root)
// 队列不为空,说明没有遍历完全
while (queue.length) {
const top = queue[0] // 取出队头元素
// 访问 top
console.log(top.val)
// 如果左子树存在,左子树入队
if (top.left) {
queue.push(top.left)
}
// 如果右子树存在,右子树入队
if (top.right) {
queue.push(top.right)
}
queue.shift() // 访问完毕,队头元素出队
}
}
BFS(root); // A B C D E F