簡體   English   中英

找到二叉樹的兩個葉子之間的最大路徑和(Java)

[英]Find the maximum path sum between two leaves of a binary tree (Java)

我正在努力解決以下問題:“給定一個二叉樹,其中每個節點元素都包含一個數字。找到從一個葉節點到另一個葉節點的最大可能總和。最大總和路徑可能會或可能不會通過根。” 我想寫這里討論的 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我保存輸出。 這段代碼的作用是給出樹中所有節點的總和。

您的代碼與文章中的代碼明顯不同(並且與使用的語言無關)。

在您的代碼中,它是:

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;
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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM