✅✅代码随想录算法训练营Day16 || 104.二叉树的最大深度,559.n叉树的最大深度, 111.二叉树的最小深度 , 222.完全二叉树的节点个

188 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情🚀🚀

104. 二叉树的最大深度 - 力扣(LeetCode)

image.png

递归写法

求最大深度,其实也就是求最大高度~ 这里一般用后序遍历去解决此类问题

    if(!root)
    return root;
    const dfs = (node) => {
        if(!node){
            return 0;
        }

        let left = dfs(node.left);
        let right = dfs(node.right);
        let height = Math.max(left,right) + 1;
        return height;
    }
    return dfs(root);

层次遍历写法

 if(!root)
    return root;
 let queue = [];
    let count = 0;
    queue.push(root)
    while(queue.length){
        let len = queue.length;
        count++;
        while(len--){
            let top = queue.shift()
            if(top.left){
                queue.push(top.left)
            }
            if(top.right){
                queue.push(top.right)
            }
        }
    }
    return count;

注:这里要用len来记录当前层数,方便对当前层进行处理

559. N 叉树的最大深度 - 力扣(LeetCode)

image.png

层次遍历

    if(!root){
        return root
    }
    let count = 0;
    let queue = [];
    queue.push(root);
    while(queue.length){
        let len = queue.length;
        count++;
        console.log(count)
        while(len--){
            let top = queue.shift();
            for(let s of top.children){
                if(s)
                queue.push(s)
            }
        }
    }
    return count;

和二叉树的最大深度很类似

111. 二叉树的最小深度 - 力扣(LeetCode)

image.png

易错

这题上来直接就按求二叉树的最大深度一样去解。

没想到直接被摆了一道。

因为如果其左子树为空的话,该二叉树的最小深度不为1!!!

而是根节点到最近叶子节点的最短路径上的节点数量。

所以概念还是有些没看懂。

递归


   const dfs = (node) => {
       if(root === null) return 0;
       if(!node.left && node.right){
            return  height = 1 + dfs(node.right);
        }
        if(!node.right && node.left){
             return height = 1 + dfs(node.left);
        }
        if(node.left && node.right){
            let left = dfs(node.left);
            let right = dfs(node.right)
            let height = 1 + Math.min(left,right);
            return height;
           }
        if(!node.left && !node.right)
        return 1;

            
    }
   return dfs(root)

这里需要注意的就是有三种判断情况

222. 完全二叉树的节点个数 - 力扣(LeetCode)

image.png

递归

    if(!root)
    return root;
    let count = 0;
    const dfs = (node) => {
        if(!node)
        return 0;
        else{
            let right = dfs(node.right)
            let left = dfs(node.left);
            count = right + left + 1 ;
            return count;
        }
    }

    return dfs(root);

层次遍历

    let queue = [];
    if(!root)
    return root;
    let count = 0;
    queue.push(root);
    while(queue.length){
        let len = queue.length;
        while(len--){
            let top = queue.shift();
            if(top.left){
                queue.push(top.left)
            }
            if(top.right){
                queue.push(top.right)
            }
            count++;

        }
    }
    return count;

什么是完全二叉树

在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2^(h-1)  个节点。

image.png