7-10リーフノードの合計(30ポイント)

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;
}

おすすめ

転載: blog.csdn.net/weixin_45845039/article/details/111569134