当前位置: 首页 > 知识库问答 >
问题:

二叉树中的最小路径和

黄信厚
2023-03-14

如何在二叉树中找到最小路径和,并打印路径?路径可以从ROOT节点到任何LEAF节点。我已经编写了C代码来查找最小和,但是在打印路径时遇到了问题。

int MinTreePathSum(TreeNode *head, vector<TreeNode> &path)
{
    if(!head)  // head is NULL
        return 0;
    else if(!(head->left) && head->right)  // only head->left is NULL
        return head->val+MinTreePathSum(head->right, path);
    else if(!(head->right) && head->left)  // only head->right is NULL
        return head->val+MinTreePathSum(head->left, path);
    else
        return head->val+min(MinTreePathSum(head->left, path), MinTreePathSum(head->right, path));  // none of left and right are NULL
}

参数列表中的路径未使用,有人能帮我打印路径和最小的路径吗?

共有2个答案

安建木
2023-03-14

我想你真的很接近。。。如果当前节点有两个子节点,只需将当前节点添加到路径并选择“最短路径”:

int MinTreePathSum(TreeNode *head, vector<TreeNode> &path)
{
    if(!head)  // head is NULL
        return 0;
    else if(!(head->left) && head->right) {  // only head->left is NULL
        path.push(*head);
        return head->val+MinTreePathSum(head->right, path);
    }else if(!(head->right) && head->left) { // only head->right is NULL
        path.push(*head);
        return head->val+MinTreePathSum(head->left, path);
    }else{ // two children, must choose one...
        path.push(*head);

        // get left and right paths
        pathLeft = vector<TreeNode>(); 
        pathRight = vector<TreeNode>();
        int valLeft = MinTreePathSum(head->left, pathLeft);
        int valRight = MinTreePathSum(head->right, pathRight);

        // actually copy the shortest path
        if (valLeft < valRight) {
            for(int i = 0; i < pathLeft.size(); ++i) {
                path.push(pathLeft[i]);
            }
        }else{
            for(int i = 0; i < pathRight.size(); ++i) {
                path.push(pathRight[i]);
            }
        }  
        // finally return the minimum path, which is the one we put in "path" already
        return head->val + min(valLeft, valRight);
    }
}
赵华彩
2023-03-14

而不是返回头-

int MinTreePathSum(TreeNode *head, string &path)
{
    if(!head)  // head is NULL
        return 0;
    else if(!(head->left) && head->right)  // only head->left is NULL
    {   
        string p; 
        int val = head->val+MinTreePathSum(head->right, p);
        path = "R" + p;
        return val;
    }
    else if(!(head->right) && head->left)  // only head->right is NULL
    {
        string p;
        int val = head->val+MinTreePathSum(head->left, p);
        path = "L" + p;
        return val;
    }
    else
    {
        int vl,vr,val;
        string pl,pr;
        vl = MinTreePathSum(head->left, pl);
        vr = MinTreePathSum(head->right, pr);
        if ( vl < vr ){
             val = vl;
             path = "L" + pl;
        } else {
             val = vr;
             path = "R" + pr;
        }
        return head->val + val;
    }
}

 类似资料:
  • 这道题是 LeetCode 124 题。 给定一个非空二叉树,返回其最大路径和。注意,这里的“路径”并非自顶向下的单向路径,而是二叉树中任意连通的路径,可以在任一节点开始和结束。比如对于下图的二叉树,10->12->9 是一个最大路径: -9 / \ 1 12 / \ 10 9 分析 首先定义“端点”的概念。一条路径有两个端点:起点和终点。比如上述示例中,

  • 我试图找到从根到叶的最小路径和,还需要计算最小路径。如果解决方案在左子树中,我的解决方案有效,但是如果结果在右子树中,根节点在结果路径中添加了两次,是否有人可以查看我的解决方案并帮助我修复此错误,如果有,还可以建议更好的运行时解决方案 我正在使用回溯访问所有节点,我认为我的解决方案的时间复杂度将是O(N)(因为所有节点都应该被访问,如果我错了,请纠正我)

  • 有一个关于二叉树的基本java示例的问题:给定一个二叉树,查找路径中节点和等于给定目标数的所有路径。(有效路径是从根节点到任何叶节点。)。为什么我们需要

  • 试图计算二叉树中从根到叶的路径和。似乎不起作用,doesIt的值变为true,但由于它是递归的,所以当堆栈弹出时,它会切换回false。我不知道怎么修。如何更改代码,使doesIt的值更改为true后,它会一直向上传播? 考虑树:[5,4,8,11, null, null, null,7,2]无序 5有两个孩子4和8,4有一个孩子11,8没有孩子 hasPathSum(根,22)

  • 我试图用kotlin中的递归来回答leetcode上二叉树中最长的曲折路径。输入如下所示 并表示二叉树。我遇到的问题与递归有关,我当前的代码在访问树中的所有节点后返回 1。但我打算让代码在每个树节点命中后添加 1 并将其添加到该锯齿形总数中。 左和右仅表示每个路径侧的相应之字形。我想知道的是,如何在每次递归调用后以println语句的方式添加这些值

  • 我正在读二叉树。在练习编码问题时,我遇到了一些解决方案,其中要求找到二叉树的最小深度。现在根据我的理解,深度是从根到节点的边数(叶节点的情况下为叶节点/二叉树) 二叉树{1,2}的最小深度是多少 根据我的解决方案,应该是1。