双色法实现二叉树的前中后和层次遍历

299 阅读1分钟

二叉树的遍历

二叉数的遍历主要有前中后遍历和层次遍历。 前中后属于 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;
   }