Binary Tree Maximum Path Sum

来源:互联网 发布:网络侮辱他人 寻衅滋事 编辑:程序博客网 时间:2024/06/05 16:02

Binary Tree Maximum Path Sum

 
Given a binary tree, find the maximum path sum.

The path may start and end at any node in the tree.

For example:
Given the below binary tree,

       1      / \     2   3

Return 6.


题目:求二叉树中所有路径中的最大路径和。(!!!注意节点值可能是负数,所以任何一个节点可以作为单独的路径,不一定是两个叶节点之间的路径)如果保证节点值都大于0,则可以说一定是叶节点的值。

分析:思路比较清晰,遍历每个节点,计算通过该节点的路径和,包括只有该节点的路径,包含该节点和其左(或右)孩子部分的路径,或者像例子中,从左到右全部包含的路径。记录下最大的和res即可,如果新路径比res大,就重置res。用lv和rv分别记录包含root的左子树和右子树可达到的最大路径。


代码:

/** * Definition for binary tree * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    int maxPathSum(TreeNode *root) {        if(root==NULL) return 0;        int l,r,res=INT_MIN;//注意,因为是可能节点值为负数,res初始化为最小的整数        helper(root,l,r,res);        return res;    }        //lv记录root的左子树可供root取得的路径最大和,rv记录右侧,res保存最大结果。    void helper(TreeNode *root, int &lv, int &rv,int &res){        if(root==NULL){            lv=0; rv=0;            return ;        }        int lv1,lv2,rv1,rv2;                helper(root->left,lv1,rv1,res);//递归        helper(root->right,lv2,rv2,res);                lv=max((max(lv1,rv1)+root->val), root->val); //如果root的左子树为负值,就直接取root->val作为lv        rv=max((root->val+max(lv2,rv2)),root->val);        int t=INT_MIN;        t=max(max(lv,rv), lv+rv-root->val);//取三者的最大值,看是否超过res,更新res                if(t>res) res=t;     }};

方法二:基于后序遍历的方法,后序遍历函数返回的是以root为端点可以达到的单侧最长路径

代码:

class Solution {public:    int maxPathSum(TreeNode *root) {        if(root==NULL) return 0;        res=INT_MIN;        postOrder(root);        return res;    }        int postOrder(TreeNode *root){//返回以root为端点可以达到的单侧最长路径        if(root==NULL) return 0;        int l=postOrder(root->left);        int r=postOrder(root->right);        int ret=max(max(l+root->val,r+root->val),root->val);//三者中最大值        res=max(res,max(l+r+root->val,ret));//res是 res本身,root可达到的单侧最大值,root左右相加的值 中三者去最大        return ret;    }    private :    int res;};

0 0