leetcode——第404题——左叶子之和

题目:

/**
 * 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 sumOfLeftLeaves(TreeNode* root) {
//         int result = 0;

//         // 还是递归遍历每个节点呀,所以终止条件还是这个咯~
//         if(root == nullptr)
//         {
//             return result;
//         }

//         /************** 接下来是递归逻辑***************************/
//         // 通过递归求出 左子树的左叶子之和 与右子树的左叶子之和
//         // 什么是左叶子? 要涉及到三层结构 
//         // 根节点    左孩子   左孩子的左孩子以及左孩子的右孩子
//         // 按照  左 右 中   的顺序来处理,也就是后序遍历
//         // 还记得吗,但凡需要用左右子树结果的,就要用后序遍历

//         // 当遇到左叶子节点的时候 记录数值,然后通过递归求取左子树左叶子之和,
//         // 与 右子树左叶子之和,相加便是整个数的左叶子之和

//         // 当前结点最多只能判断出是不是叶子,而要判断是不是左叶子只能通过父亲结点
//         int leftLeaf = sumOfLeftLeaves(root->left); 
//         int rightLeaf = sumOfLeftLeaves(root->right);
//         // 这里的if 就是对中节点的处理 ,也就是后序遍历的最后一步
//         int resTemp = 0;
//         if(root->left != nullptr && root->left->left == nullptr &&                        root->left->right == nullptr)
//         {
//             resTemp = root->left->val;
//         }
//         int sum = leftLeaf + rightLeaf + resTemp;
//         return sum;
//     }
/***********************法二::迭代法*********************************/
    int sumOfLeftLeaves(TreeNode* root)
    {
        // 迭代法用 标记法 前序遍历来实现,所以要定义栈
        stack<TreeNode*> st;
        int result = 0;
        if(root == nullptr)
        {
            return result;
        }
        st.push(root);
        while(!st.empty())
        {
            TreeNode* node = st.top();
            if(node != nullptr)
            {
                // 前序遍历哦~  栈~  压栈顺序为: 右 左 中
                st.pop();
                if(node->right != nullptr)
                {
                    st.push(node->right);
                }
                if(node->left !=nullptr)
                {
                    st.push(node->left);
                }
                st.push(node);
                st.push(nullptr);
            }
            else
            {
                st.pop();
                node = st.top();
                st.pop();
                if(node->left != nullptr && node->left->left == nullptr && 
                   node->left->right ==nullptr)
                {
                    result += node->left->val;
                }
            }
        }
        return result;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值