我正在努力解决以下问题:"给定一个二叉树,其中每个节点元素都包含一个数字。找到从一个叶节点到另一个叶节点的最大总和。 最大总和路径可能会也可能不会通过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
我保存输出。这段代码的作用是给出树中所有节点的总和。
答案 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))