题目标题: 算法2-计算给定二叉树的所有左叶子之和 题目描述: 给定扩展二叉树的前序序列,构建二叉树,计算给定二叉树的所有左叶子之和。 输入描述: 按扩展二叉树的前序序列顺序输入构建二叉树,数字和#直接用逗号间隔。 输出描述描述: 输出一个整数,其值为二叉树左叶子结点的和。 【样例说明】 示例: 3 / \ 9 20 / \ 15 7 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以输出 24 样式输入: 3,9, #,#,20,15,#,#,7,#,# 样式输出: 24
时间: 2024-01-18 10:03:11 浏览: 175
数据结构教学课件:第11-2讲 线索二叉树.pdf
算法思路:
对于给定的二叉树,我们可以通过递归的方式实现左叶子节点的求和。具体来说,对于当前节点,我们需要判断其左孩子是否为左叶子节点,如果是,则将其值加入结果中;否则,我们需要递归遍历其左子树,并返回左子树中所有左叶子节点的和。对于右子树,我们同样递归遍历,但不需要将右子树中的左叶子节点加入结果中。最终,我们将左子树和右子树的结果相加,即为所求的答案。
注意,题目中定义左叶子节点为没有左右孩子的节点,因此我们需要在递归中记录当前节点的父节点,以便判断当前节点是否为左孩子。
C++ 代码实现:
```c++
#include <iostream>
#include <string>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
int sumOfLeftLeaves(TreeNode* root, TreeNode* parent) {
if (root == NULL) return 0;
if (root->left == NULL && root->right == NULL && parent != NULL && parent->left == root) {
return root->val;
}
int leftSum = sumOfLeftLeaves(root->left, root);
int rightSum = sumOfLeftLeaves(root->right, root);
return leftSum + rightSum;
}
int main() {
string input;
getline(cin, input);
input.erase(remove(input.begin(), input.end(), ','), input.end());
TreeNode* root = NULL;
if (input != "#") {
root = new TreeNode(stoi(input));
}
TreeNode* cur = root;
for (int i = 1; i < input.size(); i++) {
if (input[i] == '#') {
if (cur == root) {
break;
}
cur = cur->right;
} else {
int j = i;
while (j < input.size() && input[j] != '#') {
j++;
}
int val = stoi(input.substr(i, j - i));
if (cur->left == NULL) {
cur->left = new TreeNode(val);
cur = cur->left;
} else {
cur->right = new TreeNode(val);
cur = cur->right;
}
i = j;
}
}
int ans = sumOfLeftLeaves(root, NULL);
cout << ans << endl;
return 0;
}
```
阅读全文