力扣:找树左下角的值java
两种方法:迭代法使用层序遍历,递归前中后都可以(中操作为空)。
流程:
首先是层序遍历
1.设置一个对列,根节点入队列(相当于输入第一层)
2.循环每层,计算对列的size(相当于记录每层有多少个节点)。
3.设置循环内循环,对列poll()出size个元素,对改层的第一个元素赋与结果值,再将每个元素判断左右孩子不为空,就输入左右孩子节点到对列。
4.最后返回记录的结果值
class Solution {
public int findBottomLeftValue(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();//设置一个对列
queue.offer(root);//根节点入队列
int result=0;//结果值
while(!queue.isEmpty()){//对列不空说明还有层未遍历
int size = queue.size();//记录该层的节点数量
for(int i =0;i<size;i++){//不断poll出该层的所有元素,并将该层元素的所有左右孩子输入对列
TreeNode node = queue.poll();
if(i==0) result=node.val;//记录该层的第一个节点赋予结果值
if(node.left!=null) queue.offer(node.left);//将左右孩子加入对列中
if(node.right!=null) queue.offer(node.right);
}
}
return result;
}
}
其次是递归遍历,前中后都一样,中操作为空。
递归三部曲:
返回值和参数:无需返回值,结果直接记录在类中,参数为根节点和当前层数。
结束条件:遇到叶子节点(判断叶子节点是否是当前最大深度下的叶子节点,不是则将该深度赋予最大深度,值赋予结果值)
单层递归逻辑:节点的左孩子不为空则对当前深度deep++,然后调用递归函数,参数为左孩子和deep,最后要对deep–(这是回溯的过程,因为左孩子递归结束了,就要回到当前深度,第二个参数也可以写成deep+1效果相同)。
节点的右孩子不为空则对当前深度deep++,然后调用递归函数,参数为右孩子和deep,最后要对deep–(这是回溯的过程,因为左孩子递归结束了,就要回到当前深度,第二个参数也可以写成deep+1效果相同)
class Solution {
int maxDeep = Integer.MIN_VALUE;//当前最大深度值
int result;//结果值
public int findBottomLeftValue(TreeNode root) {//主函数
findL(root,1);//调用递归函数
return result;
}
public void findL(TreeNode node,int deep){//递归函数,参数为根节点和当前深度
if(node.left == null&&node.right == null){//结束条件,遇到叶子结点
if(deep>maxDeep){//判断该叶子节点深度是否大于最大深度
//大于则最大深度值赋值为该深度值,该节点的值记录为结果值
//只记录第一次,之后在遇到该层的因为最大深度已经不是大于了,并且每次先遍历左孩子,所以记录的就是最左的叶子节点
maxDeep = deep;
result = node.val;
}
}
if(node.left!=null){//前面没有判空的操作,所以要判断节点左右孩子是否不为空
deep++;//deep加一,是为了在调用的时候给子节点深度加一
findL(node.left,deep);
deep--;//回溯操作,遍历完左节点,就要让deep回到当前深度
}
if(node.right!=null){
deep++;
findL(node.right,deep);
deep--;
}
}
}