代码随想录day16| 104.二叉树的最大深度、 111.二叉树的最小深度、 222.完全二叉树的节点个数

85 阅读2分钟

104. 二叉树的最大深度

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

image.png

递归: 二叉树的最大深度是左子树的最大深度 + 1 和右子树的最大深度 + 1 中最大的那个

/**
 * @param {TreeNode} root
 * @return {number}
 */
var maxDepth = function(root) {
    if(!root){ return 0}
    return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1
};

559. N 叉树的最大深度

给定一个 N 叉树,找到其最大深度。

最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。

N 叉树输入按层序遍历序列化表示,每组子节点由空值分隔(请参见示例)。

image.png

递归思路: 遍历每个子树时比较最大深度是否替换

/**
 * @param {Node|null} root
 * @return {number}
 */

var maxDepth = function(root) {
    if(root === null) return 0
    let depth = 0
     for(let i of root.children){
       depth = Math.max(depth, maxDepth(i))
    }
    return depth + 1
};

111. 二叉树的最小深度

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明: 叶子节点是指没有子节点的节点。

image.png 思路:与最大深度一样,但要注意根节点的左右子树其中一个为空的情况

/**
 * @param {TreeNode} root
 * @return {number}
 */
var minDepth = function (root) {
    if (!root) return 0
    if(!root.left){return minDepth(root.right) + 1}
    if(!root.right){return minDepth(root.left) + 1}
    return Math.min( minDepth(root.left) + 1, minDepth(root.right) + 1)
};

222. 完全二叉树的节点个数

给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。

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

image.png

思路: 当做普通二叉树递归 二叉树的节点数 = 左子树的节点数 + 右子树的节点数 + 1

var countNodes = function(root) {
    if(root === null) return 0
    return countNodes(root.left) + countNodes(root.right) + 1
};

完全二叉树对应解法:

image.png


var countNodes = function(root) {
    //利用完全二叉树的特点
    if(root === null) {
        return 0;
    }
    let left = root.left;
    let right = root.right;
    let leftDepth = 0, rightDepth = 0;
    while(left) {
        left = left.left;
        leftDepth++;
    }
    while(right) {
        right = right.right;
        rightDepth++;
    }
    if(leftDepth == rightDepth) {
        return Math.pow(2, leftDepth+1) - 1;
    }
    return countNodes(root.left) + countNodes(root.right) + 1;
};