leetcode中关于二叉树所有路径题目的个人理解
二叉树的所有路径
思路分析:
本题需要满足 根 -> 左 -> 右 的遍历顺序,因此使用前序遍历的顺序更为合适。
递归三部曲:
-
确定传入的参数:树的根节点,用于接收单条路径的List,用于接受所有路径的之和的List。
void traversal(TreeNode root,List<Integer> path,List<String> res)
-
确定结束条件:此时,只需要判断该节点是否为叶子节点即可。因为不需要返回空的NULL。
if(cur.left == null && cur.right == null){ //此时要对path做一些处理,将integer转换为string并存入String中。 StringBuilder sb = new StringBuilder(); for (int i =0;i<path.getSize()-1;i++){ sb.append(path.get(i)).append("->");//leetcode要求 } sb.append(path.get(path.size() - 1));// 记录最后一个节点,leetcode要求的 res.add(sb.toString());// 收集一个路径 return;
-
确定每层的处理事件:
- 遍历左子树,如果为null,什么也不做,如果不为空,进入循环(遍历左子树的左子树并将节点存入path中直到叶子节点)
- 遍历右子树,如果为null,什么也不做,如果不为空,进入循环(遍历右子树的右子树并将节点存入path中直到叶子节点)
- 回溯到上一个根节点
if(left){ traversal(TreeNode left,path,res); path.remove((path.size()-1); } if(right){ traversal(TreeNode right,path,res); path.remove((path.size()-1); }
整体代码(取自代码随想录)
//解法一
class Solution {
/**
* 递归法
*/
public List<String> binaryTreePaths(TreeNode root) {
List<String> res = new ArrayList<>();// 存最终的结果
if (root == null) {
return res;
}
List<Integer> paths = new ArrayList<>();// 作为结果中的路径
traversal(root, paths, res);
return res;
}
private void traversal(TreeNode root, List<Integer> paths, List<String> res) {
paths.add(root.val);// 前序遍历,中
// 遇到叶子结点
if (root.left == null && root.right == null) {
// 输出
StringBuilder sb = new StringBuilder();// StringBuilder用来拼接字符串,速度更快
for (int i = 0; i < paths.size() - 1; i++) {
sb.append(paths.get(i)).append("->");
}
sb.append(paths.get(paths.size() - 1));// 记录最后一个节点
res.add(sb.toString());// 收集一个路径
return;
}
// 递归和回溯是同时进行,所以要放在同一个花括号里
if (root.left != null) { // 左
traversal(root.left, paths, res);
paths.remove(paths.size() - 1);// 回溯
}
if (root.right != null) { // 右
traversal(root.right, paths, res);
paths.remove(paths.size() - 1);// 回溯
}
}
}