给定一个二叉树,返回所有从根结点到叶子节点的路径

给定一个二叉树,返回所有从根结点到叶子节点的路径。


public class AllNodePath{

private static class TreeNode{
    int val;
    TreeNode left;
    TreeNode right;
    public TreeNode(int val){
      this.val=val;
    }
}

public static void main(String[] args){
    TreeNode root = new TreeNode(6);
    TreeNode node11 =new TreeNode(2);
    TreeNode node12 =new TreeNode(7);
    TreeNode node21 =new TreeNode(1);
    TreeNode  node22 =new TreeNode(5);
    TreeNode  node31 =new TreeNode(3);
    TreeNode  node42 =new TreeNode(4);
    root.left= node11;
    root.right= node12;
    root11.left= node21;
    root11.right= node22;
    node22.left= node31;
    node31.right= node42;

    List<String> res=binaryTreePaths(root);
    System.out.println(res); 
}


public static List<String> binaryTreePaths(TreeNode root){
  LinkedList<String> res=new LinkedList<>();
  if(root==null) return;

   solve(root,"",res);
  return res;    
}

public static void solve(TreeNode root,String cur,LinkedList<String> res){
    if (root==null) return;
    cur +=root.val;
    if (root.left==null && root.right==null){
       res.add(cur);
    }else{
       solve(root.left,cur+"->",res);
       solve(root.right,cur+"->",res); 
    }
    
 }
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个问题需要我们构建一棵二叉树,其中根节点为root,每个节点都有一个值。回答问题分为两部分: 1. 判断是否有从根节点叶子节点路径值之和等于sum。我们可以采用递归的方式,遍历每个节点,如果当前节点叶子节点路径值之和等于sum,则返回True,否则继续遍历其左右子树。如果最终所有的叶子节点都遍历完了,仍然没有找到路径值之和等于sum的,则返回False。 2. 如果存在从根节点叶子节点路径值之和等于sum,则需要找出这样的路径。可以采用回溯法,在递归的过程中记录下遍历的路径,如果找到了路径值之和等于sum的路径,则输出该路径。 ### 回答2: 这个问题可以用深度优先搜索(DFS)算法来解决,我们从根节点开始遍历二叉树,遍历到一个节点时,我们将该节点的值加入当前路径节点值之和中,并在路径列表中加入该节点。如果该节点叶子节点并且当前路径节点值之和等于sum,那么我们就找到了一条符合条件的路径,将其加入结果列表中。 如果该节点不是叶子节点,我们就分别遍历它的左子树和右子树,直到找到一条符合条件的路径或者遍历完整棵树。每次遍历完当前节点后,我们就将该节点路径中删除,并继续遍历它的父节点的另一个节点。 具体实现见下面的代码: ``` class Solution: def pathSum(self, root, sum): res = [] def dfs(node, path, total): if not node: return path.append(node.val) total += node.val if not node.left and not node.right and total == sum: res.append(path[:]) dfs(node.left, path, total) dfs(node.right, path, total) path.pop() dfs(root, [], 0) return res ``` 这段代码中,我们首先定义了一个空的结果列表 res 和一个 dfs 函数。函数 dfs 的参数包括当前节点 node,当前路径 path 和当前路径节点值之和 total。我们首先判断当前节点是否为空,为空则直接返回。 然后将当前节点的值加入路径 path 中,并将当前节点的值加入总和 total 中。接着判断当前节点是否是叶子节点并且当前路径节点值之和等于 sum,如果是,则将当前路径加入结果列表 res 中。 最后,我们对当前节点的左子树和右子树分别使用 dfs 函数进行遍历,并在遍历后将当前节点路径 path 中删除。 在函数 pathSum 中,我们调用 dfs 函数,并将根节点一个路径以及节点值之和为 0 作为参数传入。最后返回结果列表 res。 ### 回答3: 题目描述: 给定一个二叉树root和一个值 sum: (1)判断是否有从根节点叶子节点节点值之和等于 sum 的路径; (2)若有找出二叉树结点值的和为sum的所有路径。 解题思路: 对于第一问,我们可以采用递归的方式,对于每个节点,分别计算它的左子树和右子树是否有满足要求的路径。如果当前节点叶子节点,且节点值等于sum,说明找到了一条满足要求的路径。 对于第二问,我们可以采用深度优先搜索(DFS)的方式,对于每个节点,先将它加入当前路径中,然后对它的左右子树进行操作。当搜索到叶子节点时,判断当前路径是否满足要求,如果满足则将当前路径加入结果集。最后将当前节点路径中删除,返回到父节点,继续搜索。 代码实现: (1)判断是否存在满足要求的路径 ```python def hasPathSum(root, sum): if not root: return False if not root.left and not root.right: return root.val == sum else: return hasPathSum(root.left, sum - root.val) or hasPathSum(root.right, sum - root.val) ``` (2)找出所有满足要求的路径 ```python def pathSum(root, sum): res = [] path = [] def dfs(root, sum): if not root: return path.append(root.val) sum -= root.val if not root.left and not root.right and sum == 0: res.append(path[:]) dfs(root.left, sum) dfs(root.right, sum) path.pop() # 回溯,将当前节点路径中删除 dfs(root, sum) return res ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值