7-10 叶节点求和 (30分)

对给定的有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;
}

猜你喜欢

转载自blog.csdn.net/weixin_45845039/article/details/111569134