题意:
给定一棵二叉树,返回所有左叶子值的和。
初步分析:
递归:除了节点以外还需要传递和的信息,后来还发现还需要传递判断是不是左结点的信息。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public int sumOfLeftLeaves(TreeNode root) {
return sumOfLeftTreeNodes(0, root, false);
}
public int sumOfLeftTreeNodes(int sum, TreeNode root,boolean left){
if(root==null)
return sum;
if(root.left==null && root.right==null && left) //是左叶子的处理
return sum + root.val;
else //不是左叶子就是左子树加右子树加已经有的
return sum + sumOfLeftTreeNodes(sum, root.left, true) + sumOfLeftTreeNodes(sum, root.right, false);
}
}
左子树可以直接判断,sum也可以在函数内定义和使用。所以,也可以直接递归sumOfLeftLeaves
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public int sumOfLeftLeaves(TreeNode root) {
if(root == null)
return 0;
int sum = 0;
if(root.left!=null && root.left.left == null && root.left.right == null) //左叶子结点
{
sum = root.left.val;
}
return sum + sumOfLeftLeaves(root.right) + sumOfLeftLeaves(root.left); //递归表达式
}
}
这一段是讨论区的代码,挺喜欢这种风格
public int sumOfLeftLeaves(TreeNode root) {
if (root == null) return 0;
int sum = 0;
if (root.left != null && root.left.left == null && root.left.right == null) sum += root.left.val;
sum += sumOfLeftLeaves(root.left);
sum += sumOfLeftLeaves(root.right);
return sum;
}