二叉树的遍历
二叉数的遍历主要有前中后遍历和层次遍历。 前中后属于 DFS,层次遍历属于 BFS。 DFS 都可以使用栈来简化操作,并且其实树本身是一种递归的数据结构,因此递归和栈对于 DFS 来说是两个关键点。
BFS 的关键点在于如何记录每一层次是否遍历完成, 我们可以用一个标识位来表式当前层的结束。
首先不管是前中还是后序遍历,变的只是根节点的位置, 左右节点的顺序永远是先左后右。 比如前序遍历就是根在前面,即根左右。中序就是根在中间,即左根右。后序就是根在后面,即左右根。
前序代码示例:
function colorTraversal(tree){
let stack = [['white',tree]];
let res = [];
while(stack.length>0){
const [color,node] = stack.pop();
if(!node) continue;
if(color==='white'){
stack.push(['white',node.right])
stack.push(['white',node.left])
stack.push(['gray',node.val])
}else{
res.push(node)
}
}
return res;
}
上面写的是一个前序遍历,只要稍微改下stack的push顺序就能实现中序和后序遍历; 中序:先push右侧树,再push当前value,最后push左侧树 后序:先push当前value,再push右侧树,最后push左侧树 其实就是因为是栈结构,倒序push就行。
层次遍历的话把栈结构改为队列就可以
function colorTraversal(tree){
let stack = [['white',tree]];
let res = [];
while(stack.length>0){
const [color,node] = stack.shift();
if(!node) continue;
if(color==='white'){
stack.push(['gray',node.val])
stack.push(['white',node.left])
stack.push(['white',node.right])
}else{
res.push(node)
}
}
return res;
}