Java求二叉树的最大路径和

来源:互联网 发布:网络覆盖解决方案 编辑:程序博客网 时间:2024/06/06 03:45

所谓最大路径和,是指若二叉树每个节点的值都为整数,那么某条路径上的所有节点值的和若大于其余所有路径,那么该路径所有节点值的和为该二叉树的最大路径和。

如下图所示:

最大路径为2 - 5 - 3 - 4 - 7 -2 ,则最大路径和为23。

在寻求最大路径时需要注意的是对于二叉树
    v
   /  \
  v1 v2

只有v,v+v1,v+v2这三个值的最大者才能返回给上一级。

代码实现如下:

public class MaxRoute {public static void main(String[] args){Node node1=new Node(3);node1.left=new Node(5);node1.right=new Node(4);node1.left.left=new Node(1);node1.left.right=new Node(2);node1.right.left=new Node(7);node1.right.right=new Node(8);node1.right.left.left=new Node(2);BinTree bt=new BinTree();int n=bt.maxPathSum(node1);System.out.println(n);}}class Node{int val;Node left;Node right;public Node(int x){this.val=x;}}class BinTree{public BinTree(){}//max为每次递归之后的最大路径和private int max;//travel函数递归执行子树并求子树的最大路径private int travel(Node node){int val=node.val;//lval,rval分别为左子树和右子树的最大路径值int lval=0,rval=0;//result是可以返回给上一级树的路径值int result=val;/* * 每次的travel函数中max是该级子树的最大路径值(该级子树最大路径值并不一定可以返回给上一级) * 只有val,val+lval,val+rval其中之一才可以返回给上一级 * 关键的是,max用来保存所有子树的最大路径值 *///逐级寻找应该返回到上一级的result和当前最大maxif(node.left!=null){lval=travel(node.left);if(lval>0){result=val+lval;}if(max<lval){max=lval;}}if(node.right!=null){rval=travel(node.right);if(result<val+rval){result=val+rval;}if(max<rval){max=rval;}}if(max<result){max=result;}if(max<val+lval+rval){max=val+lval+rval;}return result;}public int maxPathSum(Node root){max=Integer.MIN_VALUE;travel(root);return max;}}

运行结果:

23



1 0
原创粉丝点击