文章目录
- 11.左叶子之和
- 11.1问题
- 11.2解法一:递归
- 11.2.1递归思路
- 11.2.2代码实现
- 11.3解法二:栈
- 11.3.1栈思想
- 11.3.2代码实现
- 12.找树左下角的值
- 12.1问题
- 12.2解法一:层序遍历
11.左叶子之和
11.1问题
给定二叉树的根节点 root
,返回所有左叶子之和。
- 示例一:
输入: root = [3,9,20,null,null,15,7]
输出: 24
解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
11.2解法一:递归
- 题目要求求左叶子之和,那什么是左叶子呢?
- 左叶子即:节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点
- 因此我们需要根据孩子的父节点来判断,该孩子是否为左叶子节点
11.2.1递归思路
- 递归遍历以root为根节点的树,求其左叶子之和
public int sumOfLeftLeaves(TreeNode root)
- 结束条件:
if(root==null){
return 0;
}
//也可以不用加下面这段代码
//若为叶子节点则不用递归了,因为我们根据父节点来进行递归
if(root.left==null && root.right==null){
return 0
}
- 递归逻辑
- 递归求左节点的左叶子之和
- 若该节点的左孩子为左叶子,即找到了以该节点为根节点的左叶子之和
- 递归求右节点的左叶子之和
- 递归求左节点的左叶子之和
int leftValue=sumOfLeftLeaves(root.left);
if(root.left!=null && root.left.left==null && root.left.right==null){
leftValue=root.left.val;
}
int rightValue=sumOfLeftLeaves(root.right);
int sum = leftValue+rightValue;
return sum;
11.2.2代码实现
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
//递归
if(root==null){
return 0;
}
int leftValue=sumOfLeftLeaves(root.left);
if(root.left!=null && root.left.left==null && root.left.right==null){
leftValue=root.left.val;
}
int rightValue=sumOfLeftLeaves(root.right);
int sum = leftValue+rightValue;
return sum;
}
}
11.3解法二:栈
11.3.1栈思想
- 使用栈模拟实现递归
- 思想为中左右/中右左
11.3.2代码实现
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
//栈
Stack<TreeNode> stack=new Stack<>();
int sum=0;
if(root==null){
return sum;
}
stack.push(root);
while(!stack.isEmpty()){
TreeNode node=stack.pop();
if(node.left!=null && node.left.left==null && node.left.right==null){
//该node节点的左孩子为左叶子
sum+=node.left.val;
}
if(node.left!=null){
stack.push(node.left);
}
if(node.right!=null){
stack.push(node.right);
}
}
return sum;
}
}
12.找树左下角的值
12.1问题
给定一个二叉树的 根节点 root
,请找出该二叉树的 最底层 最左边 节点的值。
假设二叉树中至少有一个节点。
- 示例一:
输入: root = [2,1,3]
输出: 1
12.2解法一:层序遍历
- 只需在每层遍历的时候,标记最左边的元素即可
- 注意,节点的左右孩子的放入队列顺序:左孩子先(先进先出)
class Solution {
public int findBottomLeftValue(TreeNode root) {
//层序遍历
int leftValue=0;
if(root==null){
return 0;
}
Queue<TreeNode> queue=new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
int size=queue.size();
for(int i=0;i<size;i++){
TreeNode node=queue.poll();
if(i==0){
//每一层的最左边
leftValue=node.val;
}
if(node.left!=null){
queue.offer(node.left);
}
if(node.right!=null){
queue.offer(node.right);
}
}
}
return leftValue;
}
}