• 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-5B-4C-11D-7E-2F-8G-13H-4I-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

    这里只需给每个树节点添加属性weight即可,在创建树的时候每次传入父节点的weight,孩子节点迭代相加即可,并在类中设置属性maxleaveweight来记录叶子节点的最大权值,在创建树的时候就可以判断了,不需要再次调用任何一种遍历来设置maxleaveweigth

    #include<iostream>
    #include<string>
    using namespace std;
    class BitreeNode
    {
    public:
        char data;
        int weight;
        int hight;
        BitreeNode *left;
        BitreeNode *right;
        BitreeNode() :hight(0),weight(0),left(NULL), right(NULL) {}
        ~BitreeNode() {}
    };
    class Bitree
    {
    private:
        BitreeNode *Root;
        int pos,po;    
        string strtree;
        BitreeNode *CreateBitree(int w[],int fatherweight);
        void preorder(BitreeNode *t);
    public:
        int maxleaveweight;
        Bitree() { maxleaveweight = 0; };
        ~Bitree() {};
        void CreateTree(string TreeArray,int w[]);
        void preorder();
    };
    void Bitree::CreateTree(string treearray,int w[])
    {
        pos = 0;
        po = 0;
        strtree.assign(treearray);
        Root = CreateBitree(w,0);
    }
    BitreeNode *Bitree::CreateBitree(int w[],int fatherweight)
    {
        BitreeNode *T;
        char ch;
        ch = strtree[pos++];
        if (ch == '0')
            T = NULL;
        else
        {
            T = new BitreeNode();
            T->data = ch;
            T->weight = w[po++]+fatherweight;
            if (!T->left && !T->right)
                if (T->weight > maxleaveweight)
                    maxleaveweight = T->weight;
            T->left = CreateBitree(w,T->weight);
            T->right = CreateBitree(w,T->weight);
        }
        return T;
    }
    void Bitree::preorder()
    {
        preorder(Root);
        cout << maxleaveweight << endl;
    }
    void Bitree::preorder(BitreeNode *t)
    {
        if (t)
        {
            if (!t->left && !t->right)
                if (t->weight > maxleaveweight)
                    maxleaveweight = t->weight;
            preorder(t->left);
            preorder(t->right);
        }
    }
    int main()
    {
        int t;
        cin >> t;
        while (t--)
        {
            string str;
            cin >> str;
            Bitree *tree;
            int n,*w;
            cin >> n;
            w = new int[n];
            for (int i = 0; i < n; i++)
                cin >> w[i];
            tree = new Bitree();
            tree->CreateTree(str,w);
            cout << tree->maxleaveweight << endl;
        }
    }
  • 相关阅读:
    向对象数组中添加新的属性 Jim
    vuecli3.0 postcsspxtoviewport将px转化为vwvh适配/Web 端屏幕适配方案 Jim
    js深拷贝与浅拷贝 Jim
    行业死亡案例汇总(客观记录不做评价)
    wins和linux 系统不同编码格式导致的.py执行问题: bad interpreter: No such or file directory
    Pyhon之类学习1
    How to handle error In $.get()
    sql 修改列名及表名
    程序设计类网站
    数据类型
  • 原文地址:https://www.cnblogs.com/Liu269393/p/10219964.html
Copyright © 2020-2023  润新知