题目:
/**
* 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;
}
};