js完成二叉树的前中后序和层序遍历

173 阅读1分钟

深度优先遍历:从一个节点深入直到尽头再退回前一个节点,继续寻找另一个节点深入遍历。 二叉树的前中后序遍历也可看做深度优先遍历。 前序遍历:中左右 中序遍历:左中右 后序遍历:左右中 广度优先遍历:先遍历中间节点的一层,再逐层往外扩散。 二叉树的层序遍历可以看做广度优先遍历。 层序遍历:从上往下逐层遍历节点

二叉树的前中后序遍历都用到递归,递归的步骤我们可以分为3步来写

  • 确定递归函数的参数和返回值
  • 确定递归函数的终止条件
  • 确定递归函数的实现过程

1.前序遍历:

var preorderTraversal = function(root) {
 let res=[];
 const dfs=function(root){
 	  //终止条件
     if(root===null)return ;
     //中:父节点开始
     res.push(root.val);
     //左:递归左子树
     dfs(root.left);
     //右:递归右子树
     dfs(root.right);
 }
 dfs(root);
 return res;
};

2.中序遍历:

var inorderTraversal = function(root) {
    let res=[];
    const dfs=function(root){
        if(root===null){
            return ;
        }
        dfs(root.left);
        res.push(root.val);
        dfs(root.right);
    }
    dfs(root);
    return res;
};

3.后序遍历:

var postorderTraversal = function(root) {
    let res=[];
    const dfs=function(root){
        if(root===null){
            return ;
        }
        dfs(root.left);
        dfs(root.right);
        res.push(root.val);
    }
    dfs(root);
    return res;
};

4.层序遍历:

 */
var levelOrder = function(root) {
    let res=[],queue=[];
    queue.push(root);
    if(root===null){
        return res;
    }
    while(queue.length!==0){
        // 记录当前层级节点数
        let length=queue.length;
        //存放每一层的节点 
        let curLevel=[];
        for(let i=0;i<length;i++){
            let node=queue.shift();
            curLevel.push(node.val);
            // 存放当前层下一层的节点
            node.left&&queue.push(node.left);
            node.right&&queue.push(node.right);
        }
        //把每一层的结果放到结果数组
        res.push(curLevel);
    }
    return res;
};