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

版权声明:转载请注明出处 https://blog.csdn.net/weixin_41879093/article/details/83313016

题目描述 给定一颗二叉树的逻辑结构(先序遍历的结果,空树用字符‘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>
#include<queue> 
using namespace std;
   
class BiTreeNode{
    public:
        char data;
        BiTreeNode *LeftChild;
        BiTreeNode *RightChild;
        int weight;
        BiTreeNode():LeftChild(NULL), RightChild(NULL){
               
        }
        ~BiTreeNode(){
               
        }
};
   
class BiTree{
    private:
        BiTreeNode *Root;
        int pos;
        string strTree;
        BiTreeNode* CreateBiTree(){
            BiTreeNode *T;
            char ch;
            ch= strTree[pos++];
           
               
            if(ch== '0')
              T= NULL;
            else{
                T= new BiTreeNode();
                T->data= ch;
                T->weight= wt[po++];
                T->LeftChild= CreateBiTree();
                T->RightChild= CreateBiTree();
            }
            return T;
        }
        void PreOrder(BiTreeNode* t){
            if(t){
                cout<<t->data;
                PreOrder(t->LeftChild);
                PreOrder(t->RightChild);
                   
            }
        }
        void InOrder(BiTreeNode* t){
            if(t){
                   
                InOrder(t->LeftChild);
                cout<<t->data;
                InOrder(t->RightChild);
            }
        }
        void PostOrder(BiTreeNode* t){
            if(t){
                   
                PostOrder(t->LeftChild);
                PostOrder(t->RightChild);
                cout<<t->data;
            }
        }
        void  getLeaf(BiTreeNode* t, int deep){
            if(t){
                deep+= t->weight;
                  
                if(!t->LeftChild&&!t->RightChild){
                     
                    if(maxx< deep)
                     maxx= deep;
                      
                }
                getLeaf(t->LeftChild, deep);
                getLeaf(t->RightChild, deep);
                  
            }
        }
          
    public:
        int leaf;
        queue<char> qu;
        int maxx;
        int *wt;
        int po; 
        int len;
          
        BiTree(){
               
        }
        ~BiTree(){
               
        }
        void CreateTree(string TreeArray, int wei[], int n){
            pos= 0;
            leaf= 0;
            len= n;
            maxx= 0;
            po= 0;
            wt= new int[800];
            for(int  i= 0; i< len;i++)
             wt[i]= wei[i];
            strTree.assign(TreeArray);//cout<<"bbbbbbb"<<endl;
            Root= CreateBiTree();
        }
        void PreOrder(){
            PreOrder(Root);
        }
        void InOrder(){
            InOrder(Root);
        }
        void PostOrder(){
            PostOrder(Root);
        }
        void getLeaf(){
            getLeaf(Root, Root->weight);
            maxx-= Root->weight;
        }
      
};
   
int main(){
   int t;
   cin>>t;
   int wt[800];
   while(t--){
       string str;
       cin>>str;
       int n;
       cin>>n;
        
       for(int i= 0; i< n;i++){
            cin>>wt[i];
             
          }
          
          
         BiTree tree;
         tree.CreateTree(str, wt, n);//cout<<"aaaaaa"<<endl;
         tree.getLeaf();
         cout<<tree.maxx<<endl;
   }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_41879093/article/details/83313016