2.4 KiB
2.4 KiB
题目地址
https://leetcode-cn.com/problems/sum-of-left-leaves/
思路
首先要注意是判断左叶子呢,不是左子树,不要上来想着层序遍历。
因为题目中其实没有说清楚左叶子究竟是什么节点,那么我来给出左叶子的明确定义:如果左节点不为空,且左节点没有左右孩子,那么这个节点就是左叶子
大家思考一下如下图中二叉树,左叶子之和究竟是多少?
其实是0,因为这棵树根本没有左叶子!
那么判断左叶子,如果判断当前节点是不是左叶子是无法判断的,必须要通过节点的父节点来判断其左孩子是不是左叶子。
判断的根据如下:
if (node->left != NULL && node->left->left == NULL && node->left->right == NULL) {
sum = node->left->val;
}
递归写法代码如下:
递归C++代码
class Solution {
public:
int sumOfLeftLeaves(TreeNode* root) {
if (root == NULL) return 0;
int sum = 0;
if (root->left != NULL && root->left->left == NULL && root->left->right == NULL) {
sum = root->left->val;
}
return sum + sumOfLeftLeaves(root->left) + sumOfLeftLeaves(root->right);
}
};
递归的过程其实就是二叉树的前序遍历,那么写过二叉树的同学都知道,既然是二叉树的前序遍历,能写出递归,就能写出非递归。
如果对二叉树的各种递归和非递归的写法不熟悉,可以看我的这个题解: 彻底吃透二叉树的前中后序递归法和迭代法!!
那么非递归版本善良登场,判断条件都是一样的
非递归C++代码
class Solution {
public:
int sumOfLeftLeaves(TreeNode* root) {
stack<TreeNode*> st;
if (root == NULL) return 0;
st.push(root);
int result = 0;
while (!st.empty()) {
TreeNode* node = st.top();
st.pop();
if (node->left != NULL && node->left->left == NULL && node->left->right == NULL) {
result += node->left->val;
}
if (node->right) st.push(node->right);
if (node->left) st.push(node->left);
}
return result;
}
};