@TOC
513.找树左下角的值
递归法(补day15)
难度较大,代码如下:
class Solution {
public:
int result;
int maxdepth=INT_MIN;
void traversal(TreeNode* root,int depth)
{
if(root->left==nullptr&&root->right==nullptr)
{
if(maxdepth<depth)
{
maxdepth=depth;
result=root->val;
}
return;
}
if(root->left)
{
depth++;
traversal(root->left,depth);
depth--;
}
if(root->right)
{
depth++;
traversal(root->right,depth);
depth--;
}
}
int findBottomLeftValue(TreeNode* root) {
int depth=1;
traversal(root,depth);
return result;
}
};
总体思路(递归):
- 参数:在这题中,深度是至关重要的参数,因为当遍历到叶子结点时,我们只有通过深度的大小来判断它是否是最后一层的结点。所以,深度肯定是在遍历中要变化的,所以把深度作为一个重要参数。
- **终止条件:**当以叶节点为终止条件时,基本上都伴有终止行为,这两者是相辅相成的。因为最后的结果也只能在叶节点出获取,所以也已叶节点为终止条件。这类题目一般会伴有回溯。
- **单层递归逻辑:**由于没有什么对当前结点的操作,所以没有”中“了,直接上左右孩子。但是必须保证的是,左孩子一点过要在右孩子之前,目的:当左右孩子同时身处最后一层时,是左孩子先触碰到终止条件然后被赋值,然后右孩子再碰到终止条件,但是由于此时的depth==maxdepth,所以不能改变最后的result了,这就是此题最精妙之处。
一些代码细节:
class Solution {
public:
int result;
int maxdepth=INT_MIN;
- 在力扣里面是可以设置一些全局变量的,这些全局变量在递归函数里面赋完值之后,回到主函数里面依然是递归函数里面所赋的值——即全局。
- 还有一些贯穿整个递归过程的变量也可以作为全局变量,如此处的maxdepth,之前的vector result也是可以的。