二叉树的路径问题

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);//回溯
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值