左叶子之和&&找树左下角的值

81 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第18天,点击查看活动详情

404.左叶子之和

leetcode.cn/problems/su…

1.根节点不累加到结果中 2.注意理解这里的左叶子的含义:这个是所有左边的叶子节点,并不是最左的结点,所以并不能使用层序遍历去拿到第一个左边的结点

3.我们不能判断当前节点是不是左叶子

  • 只能判断当前节点是不是叶子(当前节点左为空&&右为空)

必须通过其父节点来判断其左孩子是不是左叶子

  • 条件为:当前节点的左孩子不为空 && 左孩子的左孩子为空 && 左孩子的右孩子为空 就说明当前节点的左孩子是左叶子

image-20220522222445597


遍历整个二叉树,判断是否为左叶子,如果是就累加到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. 找树左下角的值

leetcode.cn/problems/fi…

从题目和示例中,可以得知,题目要求的是:最后一层节点的第一个节点!

走一个层序遍历,记录每一层的第一个节点的值!

image-20220522225818655

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;
    }
};