题目地址(257. 二叉树的所有路径)

https://leetcode-cn.com/problems/binary-tree-paths/

题目描述

  1. 给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
  2. 叶子节点 是指没有子节点的节点。
  3. 示例 1
  4. 输入:root = [1,2,3,null,5]
  5. 输出:["1->2->5","1->3"]
  6. 示例 2
  7. 输入:root = [1]
  8. 输出:["1"]
  9. 提示:
  10. 树中节点的数目在范围 [1, 100]
  11. -100 <= Node.val <= 100

前置知识


公司

  • 暂无

思路

前序遍历 第一次碰到左右子树为空时 就输出结果
递归完,要回溯啊,因为path 不能一直加入节点,它还要删节点,然后才能加入新的节点。回溯和递归是一一对应的,有一个递归,就要有一个回溯

关键点


代码

  • 语言支持:Java

Java Code:

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode() {}
  8. * TreeNode(int val) { this.val = val; }
  9. * TreeNode(int val, TreeNode left, TreeNode right) {
  10. * this.val = val;
  11. * this.left = left;
  12. * this.right = right;
  13. * }
  14. * }
  15. */
  16. class Solution {
  17. public List<String> binaryTreePaths(TreeNode root) {
  18. //结果集
  19. ArrayList<String> res = new ArrayList<>();
  20. if (root == null) {
  21. return res;
  22. }
  23. //保存路径信息的临时结果
  24. ArrayList<Integer> paths = new ArrayList<>();
  25. loop(res, paths, root);
  26. return res;
  27. }
  28. public void loop(List<String> res, List<Integer> paths, TreeNode root) {
  29. //每次进入新的递归中 将当前的root的值添加到路径信息中
  30. paths.add(root.val);
  31. //递归的结束条件 左右节点都为空时 就可以将路径输出
  32. if (root.left == null & root.right == null) {
  33. StringBuilder sb = new StringBuilder();
  34. //先将除最后一个节点的其他节点输出 因为要加->
  35. for (int i = 0; i < paths.size() - 1; i++) {
  36. sb.append(paths.get(i)).append("->");
  37. }
  38. //输出最后一个叶节点
  39. sb.append(paths.get(paths.size()-1));
  40. //添加到结果集
  41. res.add(sb.toString());
  42. return;
  43. }
  44. //如果左子节点!=null 在递归前判断 如果为空的话就不进行下一轮的递归了
  45. if (root.left != null) {
  46. //递归左子节点
  47. loop(res, paths, root.left);
  48. //回溯 将左子节点的路径删除 因为执行到最后面已经输出到结果集了
  49. paths.remove(paths.size()-1);
  50. }
  51. //同上
  52. if (root.right != null) {
  53. loop(res, paths, root.right);
  54. paths.remove(paths.size()-1);
  55. }
  56. }
  57. }

复杂度分析

令 n 为数组长度。

  • 时间复杂度:257. 二叉树的所有路径 - 图1#card=math&code=O%28n%29&id=APHPt)
  • 空间复杂度:257. 二叉树的所有路径 - 图2#card=math&code=O%28n%29&id=P8bPS)