输入格式:
输入为一组用空格间隔的整数,个数不超过100个,表示带空指针信息的二叉树先根序列。
输出格式:
输出为两行,第一行为该二叉树路径和的最大值,第二行为一组整数,每个整数后一个空格,即该最大路径包含的结点值(按从根的叶的顺序),如果存在多条满足条件路径,则输出最左边一条。
输入样例1:
1 2 0 0 3 0 0
输出样例1:
4
1 3
输入样例2:
-1 2 0 0 3 0 0
输出样例2:
2
-1 3
解题思路:(本人比较菜,就想到这种方法)
先建树,然后遍历节点加节点的值累加,找出最大值;然后记录最大值的子节点,回溯输出。
#include<iostream>
using namespace std;
typedef struct Node{
struct Node *l,*r;
int data;
int sum;
struct Node *h;
}*tree,node;
int Max=0;
tree M;
int a[10000]; //存回溯的数据
int g=0; //存回溯的个数
void createtree(tree &T)
{
int s;
cin>>s;
if(s==0)
{
T=NULL;
}else
{
T=new node;
T->data=s;
T->sum=0;
createtree(T->l);
createtree(T->r);
}
}
void seek(tree T)
{
if(T)
{
if(T->sum>Max){
M=T;
Max=T->sum;}
if(T->l){
T->l->sum=T->l->data+T->sum;
T->l->h=T;
}
if(T->r){
T->r->sum=T->r->data+T->sum;
T->r->h=T;
}
seek(T->l);
seek(T->r);
}
}
int find(tree T)
{
if(T)
{
a[g]=T->data;
g++;
find(T->h);
}
}
int main()
{
tree T;
createtree(T);
T->sum=T->data;
seek(T); //查找和最大值,并记录和最大值得子节点
cout<<Max<<endl;
find(M); //根据子节点节点回溯
for(int i=g-1;i>=0;i--)
{
printf("%d ",a[i]);
}
}
是兄弟就砍我,点个赞再走吧