二叉树的路径问题

1.二叉树的所有路径

在这里插入图片描述

二叉树的所有路径

递归+回溯

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<String> binaryTreePaths(TreeNode root) {
        if(root==null) return null;
        List<String> ans = new ArrayList<>();//输出结果
        List<Integer> path = new ArrayList<>();//路劲存放
        //统计根节点到叶子节点的路径
        pathTravel(root,path,ans);
        return ans;
    }

    public void pathTravel(TreeNode root,List<Integer> path,List<String> ans){
        path.add(root.val);
        //叶子节点,输出(完成拼接)
        if(root.left==null&&root.right==null){
            StringBuilder sb = new StringBuilder();
            //由于箭头原因,最后元素特殊处理
            for(int i=0;i<path.size()-1;i++){
                
                sb.append(path.get(i)).append("->");
            }
            sb.append(path.get(path.size()-1));//拼接最后一个
            ans.add(sb.toString());//更新ans,且将SB类型转换为string
            return;//退出
        }

        if(root.left!=null) {
             pathTravel(root.left,path,ans);
            path.remove(path.size()-1);//回溯
        }

        if(root.right!=null) {
             pathTravel(root.right,path,ans);
            path.remove(path.size()-1);//回溯
        }

    }
}

2.路径总和

在这里插入图片描述
路径总和

单层逻辑使用递减,不断调用自身函数。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public boolean hasPathSum(TreeNode root, int targetSum) {
        //确定退出条件
        if(root==null) return false;
        //单层逻辑
        targetSum-=root.val;
        //找到叶子节点
        if(root.left==null&&root.right==null){
            return targetSum==0;
        }
        //没找到叶子结点,继续遍历
        if(root.left!=null){
            if(hasPathSum(root.left,targetSum)) return true;
            
        }
        
        if(root.right!=null){
            if(hasPathSum(root.right,targetSum)) return true;
            
        }
        return false;
        
    }    
}

3.路径总和 II

在这里插入图片描述
路径总和 II

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
        List<List<Integer>> ans = new ArrayList<>();//结果集
        List<Integer> path = new LinkedList<>();//路径
        if(root==null) return ans;
        //root不为空
        pathRes(root,targetSum,path,ans);
        return ans;

    }

    public void pathRes(TreeNode root,int targetSum,List<Integer> path,List<List<Integer>> ans){
        path.add(root.val);
        
        //找到叶子节点,输出
        if(root.left==null&&root.right==null){
            if(targetSum-root.val==0){
                ans.add(new ArrayList<>(path));//输出
            }
            return;//否则返回
        }

        if(root.left!=null){
            pathRes(root.left,targetSum-root.val,path,ans);//注意此时节点已经时root.val,targetSum-root.val
            path.remove(path.size()-1);//回溯
        }

        if(root.right!=null){
            pathRes(root.right,targetSum-root.val,path,ans);
            path.remove(path.size()-1);//回溯
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
车辆路径问题可以使用二叉树来解决。在二叉树中,每个节点代表一个路口,每个节点的左子节点代表向左转的路径,右子节点代表向右转的路径。从根节点到叶子节点的路径代表车辆的行驶路径。在这个问题中,我们需要找到从根节点到叶子节点的所有路径中最短的路径。 为了解决这个问题,我们可以使用广度优先搜索算法。我们从根节点开始,将其加入队列中。然后,我们遍历队列中的节点,并将它们的子节点加入队列中。我们还需要记录每个节点的父节点,以便在找到最短路径后能够回溯到根节点。 当我们找到一个叶子节点时,我们就可以回溯到根节点,并找到最短路径。具体实现可以参考下面的代码: ```python class Node: def __init__(self, val, left=None, right=None): self.val = val self.left = left self.right = right self.parent = None def find_shortest_path(root): queue = [root] while queue: node = queue.pop(0) if not node.left and not node.right: # found a leaf node, backtrack to root to find shortest path path = [] while node: path.append(node.val) node = node.parent return path[::-1] if node.left: node.left.parent = node queue.append(node.left) if node.right: node.right.parent = node queue.append(node.right) # create a binary tree for vehicle routing problem root = Node('A') root.left = Node('B') root.right = Node('C') root.left.left = Node('D') root.left.right = Node('E') root.right.left = Node('F') root.right.right = Node('G') # find shortest path from root to leaf node path = find_shortest_path(root) print(' -> '.join(path)) # output: A -> B -> E ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值