一、目标
给你一个二叉树的根节点 root
,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
二、代码解读
总代码:
/**
* 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) {
//创建储存路径结果的List
ArrayList<String> res = new ArrayList<>();
//创建储存当前路径的List
ArrayList<Integer> paths = new ArrayList<>();
Get(root, res, paths);
return res;
}
public void Get(TreeNode root, ArrayList<String> res, ArrayList<Integer> paths){
/*每次调取Get函数要先将当前的节点值记录起来,
因为后续递归逻辑是遍历到叶子节点结束,不先记录下来会漏掉
*/
paths.add(root.val);
if(root.left == null && root.right == null){
StringBuilder sb = new StringBuilder();
//如果递归到叶子节点,则进行当前路径的储存,储存到res中
for(int i = 0; i < paths.size(); i++){
//这里Leetcode储存路径形式要求为:a->b->c
sb.append(paths.get(i) + (i == paths.size() - 1 ? "" : "->") );
}
res.add(sb.toString());
}
//递归调用Get方法
if(root.left != null){
Get(root.left, res, paths);
//加一次回溯,删除上一次记录的节点值
paths.remove(paths.size() - 1);
}
//同上
if(root.right != null){
Get(root.right, res, paths);
paths.remove(paths.size() - 1);
}
}
}
递归第一步:确定返回值类型和传入参数
本方法是对两个动态数组进行操,无需返回值。
public void Get(TreeNode root, ArrayList<String> res, ArrayList<Integer> paths)
递归第二步:确定递归终止条件
if判断逻辑为直到递归到叶子节点,将当前记录在paths中的路径记录到结果res中。
注:每次调取Get()方法都会先记录当前节点值到路径中,因为记录到叶子节点结束,不在调取方 法第一时间将节点值加入paths中会导致最后叶子节点无法被正确记录到res结果中。
/*每次调取Get函数要先将当前的节点值记录起来,
因为后续递归逻辑是遍历到叶子节点结束,不先记录下来会漏掉
*/
paths.add(root.val);
if(root.left == null && root.right == null){
StringBuilder sb = new StringBuilder();
//如果递归到叶子节点,则进行当前路径的储存,储存到res中
for(int i = 0; i < paths.size(); i++){
//这里Leetcode储存路径形式要求为:a->b->c
sb.append(paths.get(i) + (i == paths.size() - 1 ? "" : "->") );
}
res.add(sb.toString());
}
递归第三步:确定单层逻辑
每层都会递归调取Get()方法,每一层执行完Get(执行到叶子节点)之后都要将上一次记录的节点值删除,然后在当前层继续递归执行。
//递归调用Get方法
if(root.left != null){
Get(root.left, res, paths);
//加一次回溯,删除上一次记录的节点值
paths.remove(paths.size() - 1);
}
//同上
if(root.right != null){
Get(root.right, res, paths);
paths.remove(paths.size() - 1);
}
三、总结
记录路径的递归方法中要注意每次的回溯删除。
标签:paths,JAVA,递归,Get,res,LeetCode,二叉树,root,节点 From: https://blog.csdn.net/zzb1580/article/details/143591195