题目链接
解题思路
有题目可得我们是要求解最后一行的第一个节点,所以需要遍历整棵树,并且要使用前序遍历,这样才能够实现优先遍历左边的节点
那么我们来讨论叶子节点的特性,即该节点的左孩子为空且右孩子也为空既然要求解最后一行,那么就需要维护一个数来表示当前节点所在深度,还需要一个值来将合适值返回
代码实现
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int max_dis = -1;
void traverse(TreeNode* root, int& dis, int& val)
{
if(!root)
return ;
//说明找到了叶子节点
if(root->left ==nullptr && root->right == nullptr)
{
//如果当前节点的dis大于max_dis则更新max_dis值
if(dis > max_dis)
{
max_dis = dis;
val = root->val;
}
}
if(root->left)
{
dis++;
traverse(root->left, dis, val);
dis--;
}
if(root->right)
{
dis++;
traverse(root->right, dis, val);
dis--;
}
}
int findBottomLeftValue(TreeNode* root) {
//先找到书中所有的左叶子节点,然后计算根节点到该节点的距离,返回距离最大的那个
int dis = 0;
int val = 0;
traverse(root, dis, val);
return val;
}
};