Nノード(N> = 0)を持つ特定の二分木について、リーフノード要素の合計を求めます。
入力形式:
最初の行は負でない整数Nです。これは、N個のノードがあることを意味します。
2行目は整数kで、これはツリーのルートの要素値です。
次に、N-1行があり、各行は新しいノードであり、形式は3つの整数です。
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;
}