Leetcode 题解 - 搜索--Backtracking(12):输出二叉树中所有从根到叶子的路径

[LeetCode] Binary Tree Paths 二叉树路径

 

Given a binary tree, return all root-to-leaf paths.

For example, given the following binary tree:

 

   1
 /   \
2     3
 \
  5

All root-to-leaf paths are:

["1->2->5", "1->3"]

 

这道题给我们一个二叉树,让我们返回所有根到叶节点的路径,跟之前那道Path Sum II很类似,比那道稍微简单一些,不需要计算路径和,只需要无脑返回所有的路径即可,那么思路还是用递归来解,博主之前就强调过,玩树的题目,十有八九都是递归,而递归的核心就是不停的DFS到叶结点,然后在回溯回去。在递归函数中,当我们遇到叶结点的时候,即没有左右子结点,那么此时一条完整的路径已经形成了,我们加上当前的叶结点后存入结果res中,然后回溯。注意这里结果res需要reference,而out是不需要引用的,不然回溯回去还要删除新添加的结点,很麻烦。为了减少判断空结点的步骤,我们在调用递归函数之前都检验一下非空即可,代码而很简洁,参见如下:

 

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<String> binaryTreePaths(TreeNode root) {
        List<String> paths = new ArrayList<>();
        List<Integer> values = new ArrayList<>();
        if(root == null)
            return paths;
        help(root, values, paths);
        return paths;
        
    }
//主要思路:判断是不是叶子节点 是的话返回每次遍历的结果,不是的话就往下 往下就是左右两个子树分别进行
    
    private void help(TreeNode node, List<Integer> values, List<String> paths){
        if(node == null)
            return;
        values.add(node.val);
        if(isLeaf(node)){
            paths.add(buildPath(values));
        }else{
            help(node.left, values, paths);
            help(node.right, values, paths);
        }
//当这个节点遍历之后,无论返回结果与否, 需要删除这个节点保障不影响下次的判断
        values.remove(values.size() - 1);
    }
    private boolean isLeaf(TreeNode node){
        return node.left == null && node.right == null;
    }
    private String buildPath(List<Integer> value){
        StringBuilder sb = new StringBuilder();
        for(int i=0; i < value.size(); i++){
            sb.append(value.get(i));
            if(i != value.size() - 1)
                sb.append("->");
        }
        return sb.toString();
    
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值