带条件的递归2,二叉树求和
一.描述
通过二叉树带条件的求和来更好的理解递归
可以参考前两篇文章
二.左叶子求和
来源:https://leetcode-cn.com/problems/sum-of-left-leaves/
题意为求左叶子节点的值的和
之前文章提过,若是求全部节点之和代码如下:
int sum(TreeNode node){ if(node==null) { retrun 0; } return node.val + sum(node.left) + sum(node.right); }
这题相当于带了条件的递归,条件为叶子节点,且是左节点
代码如下
class Solution { public int sumOfLeftLeaves(TreeNode root) { return Travelse(root,false); } private int Travelse(TreeNode root,boolean isLeft) { //叶子节点 且 是左节点 if(root != null && root.left == null && root.right == null && isLeft){ return root.val + Travelse(root.left,true) + Travelse(root.right,false); } if(root == null) { return 0; } //其他情况不加入本节点值 return Travelse(root.left,true) + Travelse(root.right,false); } }
三. 左叶子求和图解分析
四. 祖父节点值为偶数的节点和
来源:https://leetcode-cn.com/problems/sum-of-nodes-with-even-valued-grandparent/
同样是求和,条件是祖父节点的值为偶数,思路同上一题一模一样
这里用两个参数来记录父节点与祖父节点
代码如下:
class Solution { public int sumEvenGrandparent(TreeNode root) { return sum(root,null,null); } private int sum(TreeNode root,TreeNode parent,TreeNode grandpa){ if(root==null){ return 0; } if(grandpa==null){ return sum(root.left,root,parent) + sum(root.right,root,parent); }else{ if(grandpa.val%2!=0){ return sum(root.left,root,parent) + sum(root.right,root,parent); } }//祖父节点为偶数
return root.val + sum(root.left,root,parent) + sum(root.right,root,parent); } }
五.上题图解分析
六.总结
可以归纳为以下模板
返回值 function (集合){
if(剔除条件 1){
return function(下一个元素) 运算 function(下一个元素);
}
if(剔除条件 2){
return function(下一个元素) 运算 function(下一个元素);
}
//......
return 当前元素 运算 function(下一个元素) 运算 function(下一个元素);
}