给定一棵二叉树,求取该二叉树的所有左子叶权重之和,左子叶被定义为二叉树叶子结点中属于左子树的节点。 注:只输入一个#时,需要返回0! 以下图为例,左孩子分别有2、4、6、8,但是2、4、6都不是叶子结点,只有8才是左子叶,所以该树的左子叶权重之和为8。 输入输出格式 输入: 15 /* 树结点个数 */ 1 2 3 4 5 6 7 8 9 # # # 10 # # /* #表示空 */ 输出: 8 /* 左子叶权重之和 */
时间: 2024-03-21 12:43:47 浏览: 141
这是一个关于二叉树遍历的问题,可以使用递归或栈的方式进行解决。对于二叉树中的每个结点,我们需要判断它的左孩子是否为左子叶,如果是,则将该结点的值加入到最终结果中;如果不是,则递归遍历该结点的左子树和右子树。以下是C++代码实现:
```c++
#include <iostream>
#include <vector>
#include <stack>
#include <queue>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
// 获取左子叶权重之和
int sumOfLeftLeaves(TreeNode* root) {
if(!root) return 0;
int sum = 0;
if(root->left && !root->left->left && !root->left->right) { // 左孩子为左子叶
sum += root->left->val;
} else {
sum += sumOfLeftLeaves(root->left);
}
sum += sumOfLeftLeaves(root->right);
return sum;
}
int main() {
int n;
cin >> n;
vector<TreeNode*> nodes(n);
for(int i = 0; i < n; i++) {
int val;
cin >> val;
nodes[i] = new TreeNode(val);
}
for(int i = 0; i < n; i++) {
string left, right;
cin >> left >> right;
if(left != "#") nodes[i]->left = nodes[stoi(left) - 1];
if(right != "#") nodes[i]->right = nodes[stoi(right) - 1];
}
TreeNode* root = nodes[0];
int sum = sumOfLeftLeaves(root);
cout << sum;
return 0;
}
```
输入样例:
```
10
1 2 3 4 5 6 7 8 9 10
2 3 # # 5 6 # # 8 # #
# # # 4 # # # # # #
```
输出样例:
```
8
```
阅读全文