找到二叉树的两个叶子之间的最大路径总和(Java)

时间:2014-10-03 16:21:36

标签: java binary-tree

我正在努力解决以下问题:"给定一个二叉树,其中每个节点元素都包含一个数字。找到从一个叶节点到另一个叶节点的最大总和。 最大总和路径可能会也可能不会通过root。"我想编写这里讨论的O(n)解决方案:http://www.geeksforgeeks.org/find-maximum-path-sum-two-leaves-binary-tree/但是我有一个问题,因为java是按值传递的。有人可以帮忙吗?

编辑:这是我的方法

 private static int fromRoot(TreeNode root, int[] res){
    if(root == null)
        return 0;
    int left = fromRoot(root.left, res) + root.val;
    int right = fromRoot(root.right, res) + root.val;
    int max = Math.max(Math.max(left, right), left+right+root.val);
    if(max > res[0])
        res[0] = max;
    return Math.max(left, right);
}

int变量res我保存输出。这段代码的作用是给出树中所有节点的总和。

2 个答案:

答案 0 :(得分:1)

您的代码明显不同于文章中的代码(并且与使用的语言无关)。

在您的代码中,它是:

int left = fromRoot(root.left, res) + root.val;
int right = fromRoot(root.right, res) + root.val;
...
return Math.max(left, right);

但它应该是:

int left = fromRoot(root.left, res);
int right = fromRoot(root.right, res);
...
return Math.max(left, right) + root.val;

答案 1 :(得分:0)

import math
class Node:
    def __init__(self,data):
        self.data=data
        self.left=None
        self.right=None
def insert(root,node):
    if root is None:
        root=node
    else:
        if root.data<node.data:
            if root.right is None:
                root.right=node
            else:
                insert(root.right,node)
        if root.data>node.data:
            if root.left is None:
                root.left=node
            else:
                insert(root.left,node)

def dfs(root):
    queue=[root]
    d=[]
    while (queue):
        node=queue.pop()
        d.append(node.data)
        if node.left:
            queue.append(node.left)
        if node.right:
            queue.append(node.right)    

    return d
def lca(path1,path2):
    i=0
    j=0
    while i<len(path1) and i<len(path2):
        if path1[i]!=path2[i]:
            break
        i+=1
    i-=1
    j=i
    max1=-math.inf
    max2=-math.inf
    while (i<len(path1)):
        if path1[i]>max1:
            max1=path1[i]
        i+=1
    while (j<len(path2)):
        if path2[j]>max2:
            max2=path2[j]
        j+=1
    return (max(max1,max2))

def search(root,path,val):
    if root is None:
        return path
    elif root.data==val:
        path.append(val)
        return path
    elif root.data<val:
        path.append(root.data)
        return  search(root.right,path,val)
    elif root.data>val:
        path.append(root.data)
        return search(root.left,path,val)            
x=int(input())
z=list(map(int,input().split()))
root=Node(z[0])
for j in range(1,x):
    insert(root,Node(z[j]))
a,b=list(map(int,input().split())) 
path1=[]
p1=search(root,path1,a)
path2=[]
p2=search(root,path2,b)
print(lca(path1,path2))