自学内容网 自学内容网

DS树--二叉树之最大路径

题目描述

给定一颗二叉树的逻辑结构(先序遍历的结果,空树用字符‘0’表示,例如AB0C00D00),建立该二叉树的二叉链式存储结构

二叉树的每个结点都有一个权值,从根结点到每个叶子结点将形成一条路径,每条路径的权值等于路径上所有结点的权值和。编程求出二叉树的最大路径权值。如下图所示,共有4个叶子即有4条路径,

路径1权值=5 + 4 + 11 + 7 = 27路径2权值=5 + 4 + 11 + 2 = 22

路径3权值=5 + 8 + 13 = 26路径4权值=5 + 8 + 4 + 1 = 18

可计算出最大路径权值是27。

该树输入的先序遍历结果为ABCD00E000FG00H0I00,各结点权值为:

A-5,B-4,C-11,D-7,E-2,F-8,G-13,H-4,I-1

输入

第一行输入一个整数t,表示有t个测试数据

第二行输入一棵二叉树的先序遍历,每个结点用字母表示

第三行先输入n表示二叉树的结点数量,然后输入每个结点的权值,权值顺序与前面结点输入顺序对应

以此类推输入下一棵二叉树

输出

每行输出每棵二叉树的最大路径权值,如果最大路径权值有重复,只输出1个

输入样例1

2
AB0C00D00
4 5 3 2 6
ABCD00E000FG00H0I00
9 5 4 11 7 2 8 13 4 1
输出样例1

11
27

AC代码

#include "bits/stdc++.h"
using namespace std;

// 定义树节点结构体
struct TreeNode
{
    char val;
    int weight;
    TreeNode *left;
    TreeNode *right;
    TreeNode(char x, int w) : val(x), weight(w), left(nullptr), right(nullptr) {}
};

// 用先序遍历字符串构建二叉树
TreeNode *buildTree(const string &preorder, int &index, unordered_map<char, int> &weights)
{
    if (index >= preorder.length() || preorder[index] == '0')
    {
        index++; // 空节点
        return nullptr;
    }
    char node_val = preorder[index++];
    TreeNode *node = new TreeNode(node_val, weights[node_val]);
    node->left = buildTree(preorder, index, weights);
    node->right = buildTree(preorder, index, weights);
    return node;
}
// 计算最大路径权值
int maxPathSum(TreeNode *root)
{
    if (!root)
        return 0;
    // 如果是叶子节点,返回当前节点的权值
    if (!root->left && !root->right)
        return root->weight;
    // 递归计算左右子树的最大路径权值
    int left_sum = root->left ? maxPathSum(root->left) : 0;
    int right_sum = root->right ? maxPathSum(root->right) : 0;

    // 返回当前节点权值加上左右子树中较大的路径权值
    return root->weight + max(left_sum, right_sum);
}

int main()
{
    int t;
    cin >> t; // 测试数据数量

    while (t--)
    {
        string preorder;
        cin >> preorder; // 输入先序遍历字符串
        int n;
        cin >> n; // 输入结点数量
        vector<char> daxie;
        for (int i = 0; i < preorder.length(); i++)
        {
            if (preorder[i] >= 'A' && preorder[i] <= 'Z')
            {
                daxie.push_back(preorder[i]);
            }
        }
        unordered_map<char, int> weights; // 结点权值映射
        // vector<char> nodes;
        int weight1;
        for (int i = 0; i < n; i++)
        {
            cin >> weight1;
            weights[daxie[i]] = weight1;
            // char node;
            // int weight;
            //  cin >> node >> weight;
            // weights[node] = weight;
            // nodes.push_back(node);
        }

        int index = 0;
        TreeNode *root = buildTree(preorder, index, weights); // 构建二叉树

        // 计算最大路径权值
        int max_path_sum = maxPathSum(root);
        cout << max_path_sum << endl; // 输出最大路径权值
    }

    return 0;
}

原文地址:https://blog.csdn.net/zgy11026/article/details/143593325

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!