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个

样例输入

2 AB0C00D00 4 5 3 2 6 ABCD00E000FG00H0I00 9 5 4 11 7 2 8 13 4 1

样例输出

11 27

提示

#include<iostream>
#include<string>
using namespace std;
class BitreeNode
{
public:
    char data;
    int weight;
    BitreeNode *left;
    BitreeNode *right;
    BitreeNode()
    {
        weight=0;
        left=right=NULL;
    }
};

class Bitree
{
public:
    BitreeNode *Root;
    int pos,index;///pos控制字符,index控制权值
    int maxpath;
    string strtree;
    Bitree(int *w,string str)
    {
        pos=index=0;
        maxpath=0;
        strtree=str;
        Root=CreateBitree(w,0);
    };
    BitreeNode *CreateBitree(int *w,int fatherweight)
    {
        char ch=strtree[pos];
        pos++;
        if(ch==‘0‘)
        {
            return NULL;
        }
        else
        {
            BitreeNode *T=new BitreeNode();
            T->data=ch;
            T->weight=w[index]+fatherweight;
            index++;
            T->left=CreateBitree(w,T->weight);
            T->right=CreateBitree(w,T->weight);
            return T;
        }
    }
    void preorder(BitreeNode *T)
    {
        if(T!=NULL)
        {
            if(T->left==NULL&&T->right==NULL)
            {
                if(T->weight>maxpath)
                    maxpath=T->weight;
            }
            preorder(T->left);
            preorder(T->right);
        }
        return;
    }
};

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        string str;
        cin>>str;
        int n;
        cin>>n;
        int *a=new int[n];
        for(int i=0;i<n;i++)
            cin>>a[i];
        Bitree Tree(a,str);
        Tree.preorder(Tree.Root);
        cout<<Tree.maxpath<<endl;
        delete []a;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/SZU-DS-wys/p/12180828.html

时间: 2024-10-11 12:01:18

DS树--二叉树之最大路径的相关文章

DS树--二叉树高度

题目描述 给出一棵二叉树,求它的高度.二叉树的创建采用前面实验的方法. 注意,二叉树的层数是从1开始 输入 第一行输入一个整数t,表示有t个二叉树 第二行起输入每个二叉树的先序遍历结果,空树用字符‘0’表示,连续输入t行 输出 每行输出一个二叉树的高度 样例输入 1 AB0C00D00 样例输出 3 提示 #include<iostream> #include<string> using namespace std; class BiTreeNode { public: char

DS树+图综合练习--二叉树之最大路径

题目描述 给定一颗二叉树的逻辑结构(先序遍历的结果,空树用字符'0'表示,例如AB0C00D00),建立该二叉树的二叉链式存储结构 二叉树的每个结点都有一个权值,从根结点到每个叶子结点将形成一条路径,每条路径的权值等于路径上所有结点的权值和.编程求出二叉树的最大路径权值.如下图所示,共有4个叶子即有4条路径, 路径1权值=5 + 4 + 11 + 7 = 27          路径2权值=5 + 4 + 11 + 2 = 22 路径3权值=5 + 8 + 13 = 26            

二叉树中节点的最大距离(树的最长路径)——递归解法

上一篇文章说的是该题的一种变形,并给出了非递归解法. 现在我给出原题的一种递归解法.将会看到,现比较上篇博文,今天给出的递归解法的代码实现是相当简洁的. 问题描述: 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数. 写一个程序,求一棵二叉树中相距最远的两个节点之间的距离.测试用的树: n1 /             \ n2             n3 /        \ n4          n5 /     \    

变形二叉树中节点的最大距离(树的最长路径)——非递归解法

问题描述: 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数. 写一个程序,求一棵二叉树中相距最远的两个节点之间的距离.测试用的树: n1 /             \ n2             n3 /        \ n4          n5 /     \         /   \ n6    n7    n8    n9 /                       / n10                

二叉树中存在路径等于给定值

题目:输入一个二叉树和一个整数,打印出二叉树中所有和给定整数值相等的路径. 分析:先画图 明白几点: 1)根据题意,我们是要遍历整个树才能确定所有符合条件的路径.显然应该从根节点出发,那么我们就应该采用先序遍历.这里遍历就采用递归更简单. 2)遍历完了后如何保存路径呢?这里我们是采用vector而不是stack因为遍历的时候从根节点打印. 每次遍历一个结点,就将其压栈,当前结点访问结束后,递归函数将自动回到父节点,因此我们在函数退出之前要在路径上删除当前结点并减去当前结点的值. #include

[LeetCode] Binary Tree Maximum Path Sum 求二叉树的最大路径和

Given a binary tree, find the maximum path sum. The path may start and end at any node in the tree. For example:Given the below binary tree, 1 / 2 3 Return 6. 这道求二叉树的最大路径和是一道蛮有难度的题,难就难在起始位置和结束位置可以为任意位置,我当然是又不会了,于是上网看看大神们的解法,看了很多人的都没太看明白,最后发现了网友Yu's C

lintcode:二叉树的所有路径

二叉树的所有路径 给一棵二叉树,找出从根节点到叶子节点的所有路径. 样例 给出下面这棵二叉树: 1 / 2 3 5 所有根到叶子的路径为: [ "1->2->5", "1->3" ] 解题深度优先 可以转换成先序遍历:根左右,根结点遍历以后,遍历两个子树,是叶子结点的时候保存路径 /** * Definition of TreeNode: * public class TreeNode { * public int val; * public Tr

纸上谈兵: 树, 二叉树, 二叉搜索树

树的特征和定义 树(Tree)是元素的集合.我们先以比较直观的方式介绍树.下面的数据结构是一个树: 树有多个节点(node),用以储存元素.某些节点之间存在一定的关系,用连线表示,连线称为边(edge).边的上端节点称为父节点,下端称为子节点.树像是一个不断分叉的树根. 每个节点可以有多个子节点(children),而该节点是相应子节点的父节点(parent).比如说,3,5是6的子节点,6是3,5的父节点:1,8,7是3的子节点, 3是1,8,7的父节点.树有一个没有父节点的节点,称为根节点(

【leetcode 简单】 第七十一题 二叉树的所有路径

给定一个二叉树,返回所有从根节点到叶子节点的路径. 说明: 叶子节点是指没有子节点的节点. 示例: 输入: 1 / 2 3 5 输出: ["1->2->5", "1->3"] 解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3 # Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x