404. 左叶子之和
坑
注意审题啊。。是叶子而不是单纯的节点。
然后要通过父节点才能判断出是不是叶子节点。
卡哥的正经后序递归写法
var sumOfLeftLeaves = function(root) {
//采用后序遍历 递归遍历
// 1. 确定递归函数参数
const nodesSum = function(node){
// 2. 确定终止条件
if(node===null){
return 0;
}
let leftValue = sumOfLeftLeaves(node.left);
let rightValue = sumOfLeftLeaves(node.right);
// 3. 单层递归逻辑
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);
};
我的半吊子递归(总感觉跟迭代法有点混合了,看下方)
// 审题!是左叶子而不是左节点!
var sumOfLeftLeaves = function(root) {
let res =0;
// 递归
const computeLeft =function(root){
if(!root) return res;
if(root.left&&!root.left.left&&!root.left.right){
res +=root.left.val;
}
computeLeft(root.left);
computeLeft(root.right);
}
computeLeft(root);
return res;
};
迭代
var sumOfLeftLeaves = function(root) {
//采用层序遍历
if(root===null){
return null;
}
let queue = [];
let sum = 0;
queue.push(root);
while(queue.length){
let node = queue.shift();
if(node.left!==null&&node.left.left===null&&node.left.right===null){
sum+=node.left.val;
}
node.left&&queue.push(node.left);
node.right&&queue.push(node.right);
}
return sum;
};