Problem:
Find the sum of all left leaves in a given binary tree.
Summary:
求左子叶之和。
Analysis:
1. 求左子叶之和,即需要遍历整棵二叉树,常规的方法则为递归。首先我想到的是调用子函数,在子函数中递归,每递归至一个新的节点,首先传入bool类型标记是根节点的左子树还是右子树。若为左子树,且为叶子节点,则将当前节点的value计入和中。
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */10 class Solution {11 public:12 int sumOfLeftLeaves(TreeNode* root) {13 if (root == NULL) {14 return 0;15 }16 17 int sum = 0;18 calLeftLeaves(root->left, true, sum);19 calLeftLeaves(root->right, false, sum);20 21 return sum;22 }23 24 private:25 void calLeftLeaves(TreeNode* root, bool left, int& sum) {26 if (root == NULL) {27 return;28 }29 30 if (left && (root->left == NULL) && (root->right == NULL)) {31 sum += root->val;32 }33 34 calLeftLeaves(root->left, true, sum);35 calLeftLeaves(root->right, false, sum);36 }37 };
2. 进一步简化代码,试图不掉用子函数,在主函数中进行递归操作。
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */10 class Solution {11 public:12 int sumOfLeftLeaves(TreeNode* root) {13 if (root == NULL) {14 return 0;15 }16 17 if (root->left && root->left->left == NULL && root->left->right == NULL) {18 return root->left->val + sumOfLeftLeaves(root->right);19 }20 21 return sumOfLeftLeaves(root->left) + sumOfLeftLeaves(root->right);22 }23 };