代码随想录二叉树——左叶子之和

题目

计算给定二叉树的所有左叶子之和。

示例:
代码随想录二叉树——左叶子之和_第1张图片

思路:

左叶子的明确定义:节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点

即判断当前节点是不是左叶子是无法判断的,必须要通过节点的父节点来判断其左孩子是不是左叶子。
判断代码如下:

if (node->left != NULL && node->left->left == NULL && node->left->right == NULL) {
    左叶子节点处理逻辑
}

再次提醒:递归是用到了系统栈,迭代(非递归)是需要人工创建一个栈来实现,只不过不需要系统帮忙压栈了

  1. 递归法
class Solution {
	public int sumOfLeftLeaves(TreeNode root){
		if(root == null){
			return 0;
		}
		int leftValue = sumOfLeftLeaves(root.left);//递归求左子树的左叶子之和
		int rightValue = sumOfLeftLeaves(root.right);//递归求右子树的左叶子之和
		
		int midValue = 0;//记录左叶子的权值
		if(root.left != null && root.left.left == null && root.left.right == null){
			midValue = root.left.val;
		}
		int sum = midValue + leftValue + rightValue;
		reutrn sum;
	}
}
  1. 迭代法
//使用层序遍历迭代
class Solution {
	public int sumOfLeftLeaves(TreeNode root){
		if(root == null){
			return 0;
		}
		int sum = 0;
		Queue<TreeNode> deque = new LinkedList<>();
		deque.offer(root);
		while(!deque.isEmpty()){
			int size = deque.size();
			while(size-- > 0){
				TreeNode node = deque.poll();
				if(node.left != null){//如果左节点不为空
					deque.offer(node.left);//将左节点入队列
					if(node.left.left == null && node.left.right == null){//判断是否有左叶子,有的话统计权值
						sum += node.left.val;
					}
				}
				if(node.right != null){
					deque.offer(node.right);
				}//右节点加入继续判断右节点是否有左孩子,判断逻辑就是上面的if语句
			}
		}
		return sum;                                                                                                                                   n  
	}
}

你可能感兴趣的:(代码随想录,java)