对给定的有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
套路题,将每个结点都存起来,输入的时候,遍历已经存入的结点,更改其左右结点,注意空树的时候输出0,然后直接退出程序即可。
#include <iostream>
#include <vector>
using namespace std;
typedef struct Node {
int data;
struct Node *left;
struct Node *right;
} Node, *Tree;
int main() {
int n;
cin >> n;
if(n == 0){
cout << 0;
return 0;
}
vector<Tree> v;
Tree root = (Tree)malloc(sizeof(Node));
int k, r, d, e;
cin >> k;
root->data = k;
root->left = root->right = NULL;
v.push_back(root);
for (int i = 1; i < n; i++) {
Tree tmp = (Tree)malloc(sizeof(Node));
cin >> r >> d >> e;
tmp->data = e;
tmp->left = tmp->right = NULL;
for (int j = 0; j < v.size(); j++) {
if (v[j]->data == r) {
if (d == 0)
v[j]->left = tmp;
else
v[j]->right = tmp;
break;
}
}
v.push_back(tmp);
}
int sum = 0;
for (int i = 0; i < v.size(); i++) {
if (!v[i]->left && !v[i]->right)
sum += v[i]->data;
}
cout << sum;
return 0;
}