【问题标题】:Actual path in maximum path sum in binary tree二叉树中最大路径和中的实际路径
【发布时间】:2017-01-08 05:09:10
【问题描述】:

我正在尝试存储和打印在二叉树中查找最大路径和的问题中的实际路径。我已经知道如何找到最大路径总和(下),但是我们如何添加一个 sn-p 来输出实际路径呢?

private int maxSum;
public int maxPathSum(TreeNode root) {
maxSum = Integer.MIN_VALUE;
findMax(root);
return maxSum;
}

private int findMax(TreeNode p) {
if (p == null) return 0;
int left = findMax(p.left);
int right = findMax(p.right);
maxSum = Math.max(p.val + left + right, maxSum);
int ret = p.val + Math.max(left, right);
return ret > 0 ? ret : 0;
}

【问题讨论】:

  • 您有 2 个max 操作。这些是关键。每当您决定最大值时,您都会获得有关最大和路径的重要信息。弄清楚如何记录它。提示:您需要记录子树的根,该子树包含该子树中每个节点的最大加号(但您必须为所有节点记录它,因为您事先不知道子树)。您还需要记录p 的哪个孩子位于从p 到叶子的最大权重路径上。
  • @Gene 感谢您的提示。不过我很欣赏代码 sn-p。
  • 这看起来像是作业或学习问题。你不会从 sn-p 中学到很多东西。

标签: java algorithm binary-tree binary-search-tree graph-traversal


【解决方案1】:

你可以试试这个。

static class Node {
        
        int pathSum;
        List<Integer> path;
        
        Node(int pathSum) {
            this.pathSum = pathSum;
            this.path = new ArrayList<>();
        }
    }
    
    
    public List<Integer> maxPathSum(TreeNode root) {
        
        solve(root);
        return maxPathTrace;
        
    }
    
    
    int maxPath = Integer.MIN_VALUE;
    List<Integer> maxPathTrace = new ArrayList<>();

    public Node solve(TreeNode root) {

        if ( root == null) return new Node(0);
                
        Node leftNode = solve(root.left);
        Node rightNode = solve(root.right);
        
        int leftGain = Math.max(leftNode.pathSum, 0);
        int rightGain = Math.max(rightNode.pathSum, 0);
        
        int resultGain = leftGain + rightGain + root.val;
       
        // calculate max path and note it down    
        if ( resultGain > maxPath) {
            maxPathTrace.clear();
                if ( leftNode.pathSum >= 0) {
                    maxPathTrace.addAll(leftNode.path);
                }
                maxPathTrace.add(root.val);
                if ( rightNode.pathSum >= 0) {
                    maxPathTrace.addAll(rightNode.path);
                }
        }
         maxPath = Math.max(resultGain, maxPath);
        
        
        //calculate return path
        Node resultNode = new Node(Math.max(leftGain + root.val , rightGain + root.val));
        if ( leftGain > rightGain ) {
            if ( leftNode.pathSum >= 0) {
                resultNode.path.addAll(leftNode.path);
            }
            resultNode.path.add(root.val);
        } else {
             resultNode.path.add(root.val);
            if ( rightNode.pathSum >= 0) {
               resultNode.path.addAll(rightNode.path);
            }   
        }
        
        
        return resultNode;
        
    }

【讨论】:

  • 请在您的回答中提供更多详细信息。正如目前所写的那样,很难理解您的解决方案。
猜你喜欢
  • 2018-08-10
  • 2021-07-24
  • 2020-11-29
  • 2016-03-17
  • 1970-01-01
  • 1970-01-01
  • 2017-08-19
  • 2016-09-07
  • 1970-01-01
相关资源
最近更新 更多