对给定的有N
个节点(N>=0
)的二叉树,求叶节点元素之和。
输入格式:
第一行是一个非负整数N
,表示有N
个节点
第二行是一个整数k
,是树根的元素值
接下来有N-1
行,每行是一个新节点,格式为 r d e
三个整数,
r
表示该节点的父节点元素值(保证父节点存在);d
是方向,0
表示该节点为父节点的左儿子,1
表示右儿子;e
是该节点的元素值。
输出格式:
树中叶节点元素之和 (保证在整型变量范围之内)。
输入样例:
对于图片中的二叉树:
3
20
20 0 10
20 1 25
输出样例:
35
思路:
注意,父节点元素值没有重复,但是有可能为负值
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int n;
struct node {
int l;
int r;
int e;
}st[N];
int sum,idx;
map<int, int> mp;
void dfs(int root) {
if (st[root].l == 0 && st[root].r == 0)sum += st[root].e;
else {
if (st[root].l)dfs(st[root].l);
if (st[root].r)dfs(st[root].r);
}
}
int main()
{
int root = 0;
cin >> n >> root;
mp[root] = ++idx;
st[mp[root]].e = root;
for (int i = 1; i < n; i++) {
int a, b, c;
cin >> a >> b >> c;
mp[c] = ++idx;
st[mp[c]].e = c;
if (b)st[mp[a]].r = mp[c];
else st[mp[a]].l = mp[c];
}
dfs(mp[root]);
cout << sum;
return 0;
}