给定二叉树的根节点 root
,返回所有左叶子之和。
示例 1:
输入: root = [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
示例 2:
输入: root = [1] 输出: 0
提示:
- 节点数在
[1, 1000]
范围内 -1000 <= Node.val <= 1000
这是一道简单题目。
忘了一个C++语法,get_left_value(root,k);这个是函数调用,
函数声明为void get_left_value(TreeNode* root, int& k);这样就可以传入的是变量名K,但也能够是引用修改值!
/**
* 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:
void get_left_value(TreeNode* root, int& k) {
if(root==nullptr) return ;
if(root->left!=nullptr) {
k = k+root->left->val;
get_left_value(root->left,k);
}
if(root->right!=nullptr) {
get_left_value(root->right,k);
}
}
int sumOfLeftLeaves(TreeNode* root) {
int k=0;
get_left_value(root,k);
return k;
}
};
节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点,这个也是我不了解左叶子节点是什么,导致做错的!!!!
很可惜,上面的做法是错误的,因为没有完成一个树的遍历过程(左右中,只有左右,当然有时候页不一定需要处理中啦,比如. - 力扣(LeetCode)这个题目),因此上面是一个很大的误区,以下才是正确的一个写法!!!
class Solution {
public:
int sumOfLeftLeaves(TreeNode* root) {
if (root == NULL) return 0;
if (root->left == NULL && root->right== NULL) return 0;
int leftValue = sumOfLeftLeaves(root->left); // 左
if (root->left && !root->left->left && !root->left->right) { // 左子树就是一个左叶子的情况
leftValue = root->left->val;
}
int rightValue = sumOfLeftLeaves(root->right); // 右
int sum = leftValue + rightValue; // 中
return sum;
}
};