树的最大路径为节点值和为最大的路径。
思路
节点值为实数。对于一个节点,当前的最大路径需要考虑四种情况:自己,自己加左子树,自己加右子树,自己加左右子树。但一个节点能返回给上一个节点的路径只有三种情况:自己,自己加左子树,自己加右子树(因为加左右子树的加上父节点就不是一个路径了)。
代码
#include"stdafx.h"
#include<vector>
#include<set>
#include<iostream>
#include<string>
#include<math.h>
#include<algorithm>
using namespace std;
int maxLen = -99999;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) {
val = x;
left = NULL;
right = NULL;
}
};
TreeNode *BuildTree(vector<int> a, int i)
{
int len = a.size();
if (i >= len)
return NULL;
TreeNode *root = new TreeNode(a[i]);
root->left = BuildTree(a, 2 * i);
root->right = BuildTree(a, 2 * i + 1);
return root;
}
void PrintTree(TreeNode *root)
{
if (!root)
return;
cout << root->val;
PrintTree(root->left);
PrintTree(root->right);
}
int FindMax(TreeNode *root)
{
if (!root)
return 0;
int l = FindMax(root->left);
int r = FindMax(root->right);
int withChild = max(l + root->val, r + root->val);
int returnMax = max(withChild, root->val);
int curMax = max(returnMax, l + r + root->val);
maxLen = max(maxLen, curMax);
return returnMax;
}
int main()
{
vector<int> a = { 0,1,2,3,4,5 };
TreeNode *root = BuildTree(a, 1);
FindMax(root);
cout << maxLen;
int overover;
cin >> overover;
}