public
class
Solution {
/**
* This problem is a simple implementation of postorder tree traversal<br>
*
* @param root --root node of a tree
* @return max path sum
* @author Averill Zheng
* @version 2014-06-02
* @since JDK 1.7
*/
public
int
maxPathSum(TreeNode root) {
int
maxSum = Integer.MIN_VALUE;
Stack<TreeNode> node =
new
Stack<TreeNode>();
if
(root !=
null
){
putNodeInStack(root, node);
Map<TreeNode, Integer> maxAtNode =
new
HashMap<TreeNode, Integer>();
TreeNode currentRightNode =
null
;
while
(!node.isEmpty()){
TreeNode nodeInProcess = node.pop();
if
(nodeInProcess.right ==
null
|| currentRightNode == nodeInProcess.right){
int
leftMax =
0
, rightMax =
0
;
if
(nodeInProcess.left !=
null
)
leftMax = maxAtNode.get(nodeInProcess.left);
if
(nodeInProcess.right !=
null
)
rightMax = maxAtNode.get(nodeInProcess.right);
maxSum = (maxSum < rightMax + nodeInProcess.val + leftMax) ? rightMax + nodeInProcess.val + leftMax : maxSum;
int
maxOfNode = Math.max(Math.max(leftMax + nodeInProcess.val, nodeInProcess.val), rightMax + nodeInProcess.val);
maxSum = (maxSum < maxOfNode)? maxOfNode : maxSum;
maxAtNode.put(nodeInProcess, maxOfNode);
if
(!node.isEmpty() && node.peek().right == nodeInProcess)
currentRightNode = nodeInProcess;
}
else
{
node.push(nodeInProcess);
putNodeInStack(nodeInProcess.right, node);
}
}
}
return
maxSum;
}
private
void
putNodeInStack(TreeNode root, Stack<TreeNode> node){
while
(root !=
null
){
node.push(root);
if
(root.left !=
null
){
node.push(root.left);
root = root.left;
}
else
if
(root.right !=
null
){
node.push(root.right);
root = root.right;
}
else
root =
null
;
}
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步