给出一个二叉排序树的层次遍历,求从它的一个叶子结点到另一个叶子结点的路径,
要求路径上经过结点的数值之和最大。二叉树的层次遍历序列从文件expr.in中读取,
结点数值大于0,将结果输出到标准输出中.
输入示例:
25 15 40 5 20 30 50 10 35
输出示例:
165
根据上述输入可以构建如下二叉树,最长路径为 20, 15, 25, 40, 30, 35,和为165,这里注意最长路径不一定经过树的根节点。
- 25
/ \
15 40
/ \ / \
5 20 30 50
\ \
10 35
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
struct TreeNode{
int val;
TreeNode *left,*right;
TreeNode(int v):val(v),left(nullptr),right(nullptr){}
};
int res = 1e-9;
TreeNode* construct(TreeNode* node,int v){
if(!node){
TreeNode* t = new TreeNode(v);
return t;
}
if(node->val > v)node->left = construct(node->left,v);
else node->right = construct(node->right,v);
return node;
}
int postorder(TreeNode* root){
if(!root)return 0;
if(!root->left && !root->right)return root->val;
int l = postorder(root->left);
int r = postorder(root->right);
// 当以当前节点为转折点时,记录一下最大值
if(root->left && root->right){
res = max(res,l + r + root->val);
}
// 不以当前节点为转折点,只能选取左边或者右边
return max(l,r) + root->val;
}
int main(){
// 这里需要改一下读入方式
vector<int> note;
// ifstream ifs("../tree.in");
int a;
cin >>a;
TreeNode* root = new TreeNode(a);
while(cin>>a){
construct(root,a);
}
postorder(root);
cout<<res<<endl;
return 0;
}