题目地址
思路
这道题首先要搞清楚什么是左叶子,即如何去判断一个节点是叶子节点?
如上图所示,2节点是叶子节点,但他不是左叶子节点。
所以我们要判断一个节点是不是左叶子节点,要从父节点出发。即:
父节点的左孩子节点是否非空**&&父节点的左孩子节点的左孩子节点是否为空&&**父节点的左孩子节点的右孩子节点是否为空。
满足这三个条件才是左叶子节点。
本题可以采用前中后序遍历来实现,也可以用递归来实现。
具体实现代码如下:
代码实现(C++)
迭代实现(深度优先遍历)
class Solution {
public:
int sumOfLeftLeaves(TreeNode* root)
{
stack<TreeNode*> st;
if(root==nullptr)
{
return 0;
}
st.push(root);
int res=0;
while(!st.empty())
{
TreeNode* node=st.top();
st.pop();
if(node->left!=nullptr&&node->left->left==nullptr&&node->left->right==nullptr)
{
res+=node->left->val;
}
if(node->right)
{
st.push(node->right);
}
if(node->left)
{
st.push(node->left);
}
}
return res;
}
};
递归实现(深度优先遍历)
class Solution {
public:
int sumOfLeftLeaves(TreeNode* root)
{
if(root==nullptr)
{
return 0;
}
int leftnum=sumOfLeftLeaves(root->left);
int rightnum=sumOfLeftLeaves(root->right);
int temp=0;
if(root->left!=nullptr&&root->left->left==nullptr&&root->left->right==nullptr)
{
temp+=root->left->val;
}
int res=temp+leftnum+rightnum;
return res;
}
};