path_sum2

题目描述

Given a binary tree and a sum, find all root-to-leaf paths where each path’s sum equals the given sum.

For example:
Given the below binary tree and sum = 22,

          5
         / \
        4   8
       /   / \
      11  13  4
     /  \    / \
    7    2  5   1

return

[

[5,4,11,2],

[5,8,4,5]

]

解题思路

做此题前可以先尝试path_sum,判断二叉树是否存在一条根节点到叶子节点路径使得数值和等于sum,这里则是求出所有的这样的路径集合。

原先的递归关键点是对左右儿子节点递归,左右有一个返回true,当前函数就返回true,现在我们是计算路径,所以每个节点都需要对左右子树遍历,对于符合条件的路径加入到结果结合中。

为了找到一条路径,我定义了一个SuperNode,可以记录其前驱,数据结构如下:

 public class SuperNode {
     int val;
     SuperNode pre;//指向前驱节点
     public SuperNode(int x) 
        { 
            val = x; 
            pre = null;
        }
 }

每次经过一个节点,我们都建立一个supernode sn,标记该节点的val,以及其前驱,如果找到一条符合条件的通路,则把这个sn加入到我们的节点结合List中,最后对list遍历,对其中每个元素sn,进行找前驱的方式,可以得到一条路径,然后放到路径集合中。

详细代码

//path sum2
public List<List<Integer>> pathSum(TreeNode root, int sum) 
{
    List<List<Integer>> resultLists = new ArrayList<>();//结果路径集合
    List<SuperNode> superNodes = new ArrayList<>();//supernodes 集合,每个supernode可以生成一条路径。
    if(root == null)
    {
        return resultLists;
    }
    findPathSum(root, sum, new SuperNode(root.val), superNodes);
    for(SuperNode sn:superNodes)//对supernodes进行遍历,每个node生成一条路径
    {
        List<Integer> lists = new LinkedList<>(); //利用链表插入提高效率
        while(sn != null)
        {
            lists.add(0, sn.val);
            sn = sn.pre;
        }
        resultLists.add(lists);
    }
    return resultLists;
}

 public class SuperNode {
     int val;
     SuperNode pre;//指向前驱节点
     public SuperNode(int x) 
        { 
            val = x; 
            pre = null;
        }
 }

//找到指定路径 返回null为没有 否则可以根据node遍历得到逆序
public void findPathSum(TreeNode root, int sum, SuperNode sn, List<SuperNode> superNodes) {
    if(root == null)
    {
        //空树  结束条件之一
        return;
    }
    else 
    {
        if(root.left==null && root.right==null)
        {
            //叶子节点 left right都为空
            if(sum== root.val)
            {
                superNodes.add(sn);
                return;
            }
            else 
            {
                return;
            }
        }
        else 
        {
            //非叶子结点
            if(root.left != null)
            {
                SuperNode node = new SuperNode(root.left.val);
                node.pre = sn;
                findPathSum(root.left, sum-root.val,node, superNodes);

            }
            if(root.right != null)
            {
                SuperNode node = new SuperNode(root.right.val);
                node.pre = sn;
                findPathSum(root.right, sum-root.val,node, superNodes);

            }

        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码涉及到了变量的定义和函数的调用,下面是对每个部分的解释: 1. `dic = {}`:这行代码创建了一个空的字典对象,并将其赋值给变量`dic`。字典是Python中一种可变的数据结构,用于存储键值对。 2. `project_sum = project_sum(file_path)`:这行代码调用了名为`project_sum`的函数,并将函数返回的结果赋值给变量`project_sum`。根据代码片段中的信息,这个函数可能是用于计算项目总结的函数。`file_path`是作为函数参数传递给`project_sum`函数的。 3. `people = people(file_path)`:这行代码调用了名为`people`的函数,并将函数返回的结果赋值给变量`people`。根据代码片段中的信息,这个函数可能是用于处理与人员相关的数据的函数。`file_path`是作为函数参数传递给`people`函数的。 4. `people_lev = calculate_level(file_path)`:这行代码调用了名为`calculate_level`的函数,并将函数返回的结果赋值给变量`people_lev`。根据代码片段中的信息,这个函数可能是用于计算人员级别或评估等级的函数。`file_path`是作为函数参数传递给`calculate_level`函数的。 5. `bug_reason = bug_reason(file_path)`:这行代码调用了名为`bug_reason`的函数,并将函数返回的结果赋值给变量`bug_reason`。根据代码片段中的信息,这个函数可能是用于处理与Bug原因相关的数据的函数。`file_path`是作为函数参数传递给`bug_reason`函数的。 6. `testpeople_sum = Testpeople_sum(file_path)`:这行代码调用了名为`Testpeople_sum`的函数,并将函数返回的结果赋值给变量`testpeople_sum`。根据代码片段中的信息,这个函数可能是用于处理与测试人员相关的数据的函数。`file_path`是作为函数参数传递给`Testpeople_sum`函数的。 7. `dev_other = dev_other(file_path)`:这行代码调用了名为`dev_other`的函数,并将函数返回的结果赋值给变量`dev_other`。根据代码片段中的信息,这个函数可能是用于处理与开发人员其他方面相关的数据的函数。`file_path`是作为函数参数传递给`dev_other`函数的。 8. `would_conclusion = would_conclusion(file_path)`:这行代码调用了名为`would_conclusion`的函数,并将函数返回的结果赋值给变量`would_conclusion`。根据代码片段中的信息,这个函数可能是用于处理某种结论或推论的函数。`file_path`是作为函数参数传递给`would_conclusion`函数的。 请注意,对于每个变量和函数的具体含义,需要根据实际代码和上下文来确定。以上只是根据代码片段中的信息进行的推测。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值