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

时间限制1s

内存限制128MB

题目描述

给定一颗二叉树的逻辑结构(先序遍历的结果,空树用字符‘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

DS树--二叉树之最大路径_第1张图片

输入

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

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

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

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

输出

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

#include 
#include 
using namespace std;
class BiTreeNode {
public:
	char  data;	//数据域
    int weight;

	BiTreeNode  *leftChild,  *rightChild,*parent;	//左右子树指针
	BiTreeNode():leftChild(NULL), rightChild(NULL),parent(NULL){}
	~BiTreeNode() {}
};

class BiTree {
private:

	BiTreeNode *root;	//根结点指针
	string sTree;		//建树字符串
	int pos,pos2;			//标识建树字符串的当前字符位置
	BiTreeNode * CreateTree(int w1[]);//建树私有函数
public:
    int max=0;
	BiTree():root(NULL) {};
	void Create(string vArray,int w1[]);	//建树公有接口,参数是特定的先序遍历字符串
	int findparent(BiTreeNode* T,int sum){
        if(T!=root){
            sum+=T->weight;
            sum= findparent(T->parent,sum);
        }
        return sum;
    }
    void findchild(){
        findchild(root);
    }
    void findchild(BiTreeNode* T){
        if(T){
            if(!T->leftChild&&!T->rightChild){
                int sum=findparent(T,0);
                sum+=root->weight;
                if(maxleftChild);
            findchild(T->rightChild);
        }
    }

};
void BiTree::Create(string vArray,int w1[])
{	pos=0;pos2=0;
	sTree.assign(vArray);	//把参数保存到内部字符串
	root = CreateTree(w1);	//建树成功后root指向根结点
}
//请完成上述类内部的私有函数实现
BiTreeNode* BiTree::CreateTree(int w1[]){
    BiTreeNode* T;
    char ch= sTree[pos++] ;
    if(ch=='0') T=NULL;
    else {
        T=new BiTreeNode;
        T->data=ch;
        T->weight=w1[pos2++];

        T->leftChild=CreateTree(w1);
        if(T->leftChild) T->leftChild->parent=T;
        T->rightChild=CreateTree(w1);
        if(T->rightChild) T->rightChild->parent=T;
    }
    return T;
}
//主函数
int main()
{	int t;
	string vArray;
	cin>>t;
	while(t--)
	{	cin>>vArray;
        int n;cin>>n;int w[n];
        for (int i = 0; i < n; ++i) {
            cin>>w[i];
        }
		BiTree myTree;
		myTree.Create(vArray,w);
        myTree.findchild();
        cout<


 

 

你可能感兴趣的:(C++,算法,数据结构)