Leetcode题目链接
给定二叉树的根节点 root ,返回所有左叶子之和。
首先要注意是判断左叶子,不是二叉树左侧节点,所以不要上来想着层序遍历。
因为题目中其实没有说清楚左叶子究竟是什么节点,那么我来给出左叶子的明确定义:节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点
大家思考一下如下图中二叉树,左叶子之和究竟是多少?
没有左叶子!
但看这个图的左叶子之和是多少?
那么判断当前节点是不是左叶子是无法判断的,必须要通过节点的父节点来判断其左孩子是不是左叶子。
如果该节点的左节点不为空,该节点的左节点的左节点为空,该节点的左节点的右节点为空,则找到了一个左叶子,判断代码如下:
if (node->left != NULL && node->left->left == NULL && node->left->right == NULL) {
左叶子节点处理逻辑
}
递归求解
- 确定递归参数和返回值
public int getLeftVal(TreeNode root){}
- 确定终止条件
如果遍历到空节点,那么左叶子值一定是0
if (root == null) return 0;
- 确定单层递归的逻辑
当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和,和 右子树左叶子之和,相加便是整个树的左叶子之和。
int leftVal = getLeftVal(root.left);
int rightVal = getLeftVal(root.right);
if (root.left != null && root.left.left == null && root.left.right == null){
leftVal = root.left.val;
}
return leftVal+rightVal;