222.完全二叉树的节点个数、404.左叶子之和

53 阅读2分钟

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

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

题目分析

题目要求,求完全二叉树的节点个数。完全二叉树,在前面的文章中有介绍,这里就不一一赘述了。

解决

首先来进行三要素的分析:

  1. 递归函数的参数和返回值

递归的参数是节点返回值是子树的高度。

  1. 终止条件

终止条件与大多数二叉树的题相似,节点为空的时候终止,返回0。

  1. 单层循环的逻辑

单层循环的逻辑十分清晰,递归求出左子树的节点数和右子树的节点数,再返回相加。记得加一加上根节点。

代码如下:

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

404.左叶子之和

题目分析

题目要求返回二叉树的所有左叶子之和。二叉树的左叶子并不是二叉树的左侧节点,所以不能使用层次遍历。

当节点有左子树,并且节点的左子树没有左子树和右子树,那么节点的左子树即为左叶子。

解决

首先来进行三要素的分析:

  1. 递归函数的参数和返回值

函数的参数为节点返回值为左叶子的和。

  1. 终止条件

节点为空的时候终止,返回0。

  1. 单层循环的逻辑

这道题使用后序遍历当找到左叶子的时候,将左叶子的值存储到临时变量中,返回子树的左叶子与当前左叶子的和。

代码如下:

    const nodesSum = function(node){
        if(node===null){
            return 0;
        }
        let leftValue = nodesSum(node.left);
        let rightValue = nodesSum(node.right);
        let midValue = 0;
        if(node.left&&node.left.left===null&&node.left.right===null){
            midValue = node.left.val;
        }
        let sum = midValue + leftValue + rightValue;
        return sum;
    }
    return nodesSum(root);
};

总结

二叉树的递归遍历有很多相似性,分析完三要素后可以很容易的写出,目前并没有掌握迭代法解决问题。