本文是力扣LeeCode-513、找树左下角的值 学习与理解过程,本文仅做学习之用,对本题感兴趣的小伙伴可以出门左拐LeeCode。
给定一个二叉树的 根节点 root
,请找出该二叉树的 最底层 最左边 节点的值。
假设二叉树中至少有一个节点。
示例 1:
输入: root = [2,1,3]
输出: 1
示例 2:
输入: [1,2,3,4,null,5,6,null,null,7]
输出: 7
提示:
二叉树的节点个数的范围是 [1,10^4]
-2^31 <= Node.val <= 2^31 - 1
思路
递归法
题⽬:在树的最后⼀⾏找到最左边的值
使⽤递归法,如何判断是最后⼀⾏呢,其实就是深度最⼤的叶⼦节点⼀定是最后⼀⾏
找深度最⼤、找最左边的叶⼦节点
:
可以使⽤前序遍历(当然中序,后序都可以,因为本题没有 中间节点的处理逻辑,只要左 优先就⾏),保证优先左边搜索,然后记录深度最⼤的叶⼦节点,此时就是树的最后⼀⾏最左边的值
1. 确定递归函数的参数和返回值
int maxDepth = Integer.MIN_VALUE; // 全局变量 记录最⼤深度
int result;
getLeftDownVal(TreeNode cur,int depth)
2. 确定终⽌条件
遇到叶⼦节点来更新最⼤深度
if(cur.left==null&&cur.right==null){
if(depth>maxDepth){
maxDepth=depth; // 更新最⼤深度
result = cur.val; // 最⼤深度最左⾯的数值
}
return;
}
- 确定单层递归的逻辑
注:找最⼤深度的时候,递归的过程中依然要使⽤回溯
if(cur.left!=null){
depth++;
getLeftDownVal(cur.left,depth);
depth--;
}
if(cur.right!=null){
depth++;
getLeftDownVal(cur.right,depth);
depth--;
}
return;
整体代码
class Solution {
int maxDepth = Integer.MIN_VALUE;
int result;
public int findBottomLeftValue(TreeNode root) {
getLeftDownVal(root,0);
return result;
}/* */
void getLeftDownVal(TreeNode cur,int depth){
if(cur.left==null&&cur.right==null){
if(depth>maxDepth){
maxDepth=depth;
result = cur.val;
}
return;
}
if(cur.left!=null){
depth++;
getLeftDownVal(cur.left,depth);
depth--;
}
if(cur.right!=null){
depth++;
getLeftDownVal(cur.right,depth);
depth--;
}
return;
}
}
层序遍历(省略)
套个层序遍历模版
就可以解决了,可以参考本人层序遍历博客
最重要的一句话:做二叉树的题目,首先需要确认的是遍历顺序
大佬们有更好的方法,请不吝赐教,谢谢