开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第18天,点击查看活动详情
404.左叶子之和
1.根节点不累加到结果中 2.注意理解这里的左叶子的含义:这个是所有左边的叶子节点,并不是最左的结点,所以并不能使用层序遍历去拿到第一个左边的结点
3.我们不能判断当前节点是不是左叶子
- 只能判断当前节点是不是叶子(当前节点左为空&&右为空)
必须通过其父节点来判断其左孩子是不是左叶子
- 条件为:当前节点的左孩子不为空 && 左孩子的左孩子为空 && 左孩子的右孩子为空 就说明当前节点的左孩子是左叶子
遍历整个二叉树,判断是否为左叶子,如果是就累加到sum中
核心代码:通过当前节点判断它的左孩子是不是左叶子root->left && root->left->left == nullptr&& root->left->right == nullptr
- root->left !=nullptr 保证了当前节点有左孩子
- root->left->left == nullptr &&root->left->right == nullptr : 说明当前节点的左孩子没有孩子->是叶子节点->是左叶子
同理:判断是不是右叶子:root->right&& root->right->right== nullptr&& root->right->left== nullptr
- root->right!=nullptr 保证了当前节点有右孩子
- root->right->left == nullptr &&root->right->right== nullptr : 说明当前节点的右孩子没有孩子->是叶子节点->是右叶子
class Solution {
public:
int sum = 0;//统计左叶子的值的和,相当于是全局变量
int sumOfLeftLeaves(TreeNode* root) {
if(root == nullptr) return 0;
//问题所在:左叶子如何判断
//根据父亲判断比较好!
//如果当前节点的左孩子不为空 && 左孩子的左孩子为空 && 左孩子的右孩子为空 就说明当前节点的左孩子是左叶子
if(root->left && root->left->left == nullptr&& root->left->right == nullptr)
{
sum+=root->left->val;//累加当前节点的左孩子的值 (累加左叶子的值)
}
sumOfLeftLeaves(root->left);//去右树递归
sumOfLeftLeaves(root->right);//去左树递归
return sum;
}
};
513. 找树左下角的值
从题目和示例中,可以得知,题目要求的是:最后一层节点的第一个节点!
走一个层序遍历,记录每一层的第一个节点的值!
class Solution {
public:
int findBottomLeftValue(TreeNode* root) {
//层序遍历思想,用一个变量保存每一层最左边的值,当最后一层执行完循环之后,该变量就是最后一层最左边的值
int leftVal = 0;//
queue<TreeNode*> q;
q.push(root);
while(!q.empty())
{
int size = q.size();//当层有多少个节点
for(int i = 0;i<size;i++)
{
TreeNode* tmp = q.front();
q.pop();
if(i == 0) //当前节点是该层第一个节点(即当前曾最左节点)
{
leftVal = tmp->val;
}
if(tmp->left) q.push(tmp->left);
if(tmp->right) q.push(tmp->right);
}
}
return leftVal;
}
};