📌  相关文章
📜  教资会网络 | UGC-NET CS 2017 年 11 月 – III |问题 54(1)

📅  最后修改于: 2023-12-03 15:39:56.275000             🧑  作者: Mango

教资会网络 | UGC-NET CS 2017 年 11 月 – III | 问题 54

这是一个计算机科学相关的问题,主要考察对于树的遍历和递归的理解。程序员们可以通过这个问题来提高对于树形数据结构的理解,同时也可以加强对于递归编程的掌握。

问题描述

给出一棵二叉树,每个节点上有一个正整数。定义一个节点的贡献值为其到根节点的路径上的所有节点值的乘积。现在需要计算这棵二叉树的所有节点的贡献值的和。

输入格式:

第一行包含一个整数 n,表示二叉树的节点个数。

接下来 n 行,每行包含三个整数 p,l,r,表示节点的编号为 p,左子节点为 l,右子节点为 r。

接下来 n 行,每行包含一个正整数,表示这个节点上的数值。

输出格式:

一个整数,表示这棵二叉树的所有节点的贡献值的和。

示例:

输入
3
0 1 2
1 3 4
2 -1 -1
1
2
3
输出
11
解题思路

对于每个节点的贡献值可以通过递归实现。如果一个节点存在,它的贡献值等于它的值乘以它的左子节点的贡献值和它的右子节点的贡献值,否则它的贡献值为 0。

递归的结束条件是节点不存在,返回 0。否则递归计算左右子节点的贡献值,并将所有值相加。

代码实现
#include <iostream>
using namespace std;

const int N = 1010;
int n;
int l[N], r[N], w[N];

int dfs(int u, int depth) //参数1表示要计算的节点编号,参数2表示该节点深度
{
    if (u == -1)    return 0; //节点不存在,返回0

    int left = dfs(l[u], depth + 1); //计算左子节点的贡献值
    int right = dfs(r[u], depth + 1); //计算右子节点的贡献值

    return left + right + w[u] * depth; //返回当前节点的贡献值
}

int main()
{
    cin >> n;

    //读入二叉树的结构
    for (int i = 1; i <= n; i ++)
        cin >> i >> l[i] >> r[i];

    //读入二叉树节点的值
    for (int i = 1; i <= n; i ++)
        cin >> w[i];

    int res = dfs(1, 0); //从根节点开始计算

    cout << res << endl;

    return 0;
}

返回的代码片段:

```python
#include <iostream>
using namespace std;

const int N = 1010;
int n;
int l[N], r[N], w[N];

int dfs(int u, int depth) //参数1表示要计算的节点编号,参数2表示该节点深度
{
    if (u == -1)    return 0; //节点不存在,返回0

    int left = dfs(l[u], depth + 1); //计算左子节点的贡献值
    int right = dfs(r[u], depth + 1); //计算右子节点的贡献值

    return left + right + w[u] * depth; //返回当前节点的贡献值
}

int main()
{
    cin >> n;

    //读入二叉树的结构
    for (int i = 1; i <= n; i ++)
        cin >> i >> l[i] >> r[i];

    //读入二叉树节点的值
    for (int i = 1; i <= n; i ++)
        cin >> w[i];

    int res = dfs(1, 0); //从根节点开始计算

    cout << res << endl;

    return 0;
}