持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情
222.完全二叉树的节点个数
题目分析
题目要求,求完全二叉树的节点个数。完全二叉树,在前面的文章中有介绍,这里就不一一赘述了。
解决
首先来进行三要素的分析:
- 递归函数的参数和返回值
递归的参数是节点返回值是子树的高度。
- 终止条件
终止条件与大多数二叉树的题相似,节点为空的时候终止,返回0。
- 单层循环的逻辑
单层循环的逻辑十分清晰,递归求出左子树的节点数和右子树的节点数,再返回相加。记得加一加上根节点。
代码如下:
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.左叶子之和
题目分析
题目要求返回二叉树的所有左叶子之和。二叉树的左叶子并不是二叉树的左侧节点,所以不能使用层次遍历。
当节点有左子树,并且节点的左子树没有左子树和右子树,那么节点的左子树即为左叶子。
解决
首先来进行三要素的分析:
- 递归函数的参数和返回值
函数的参数为节点返回值为左叶子的和。
- 终止条件
节点为空的时候终止,返回0。
- 单层循环的逻辑
这道题使用后序遍历当找到左叶子的时候,将左叶子的值存储到临时变量中,返回子树的左叶子与当前左叶子的和。
代码如下:
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);
};
总结
二叉树的递归遍历有很多相似性,分析完三要素后可以很容易的写出,目前并没有掌握迭代法解决问题。