题目地址(257. 二叉树的所有路径)
https://leetcode-cn.com/problems/binary-tree-paths/
题目描述
给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。叶子节点 是指没有子节点的节点。示例 1:输入:root = [1,2,3,null,5]输出:["1->2->5","1->3"]示例 2:输入:root = [1]输出:["1"]提示:树中节点的数目在范围 [1, 100] 内-100 <= Node.val <= 100
前置知识
公司
- 暂无
思路
前序遍历 第一次碰到左右子树为空时 就输出结果
递归完,要回溯啊,因为path 不能一直加入节点,它还要删节点,然后才能加入新的节点。回溯和递归是一一对应的,有一个递归,就要有一个回溯
关键点
代码
- 语言支持:Java
Java Code:
/*** 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) {//结果集ArrayList<String> res = new ArrayList<>();if (root == null) {return res;}//保存路径信息的临时结果ArrayList<Integer> paths = new ArrayList<>();loop(res, paths, root);return res;}public void loop(List<String> res, List<Integer> paths, TreeNode root) {//每次进入新的递归中 将当前的root的值添加到路径信息中paths.add(root.val);//递归的结束条件 左右节点都为空时 就可以将路径输出if (root.left == null & root.right == null) {StringBuilder sb = new 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;}//如果左子节点!=null 在递归前判断 如果为空的话就不进行下一轮的递归了if (root.left != null) {//递归左子节点loop(res, paths, root.left);//回溯 将左子节点的路径删除 因为执行到最后面已经输出到结果集了paths.remove(paths.size()-1);}//同上if (root.right != null) {loop(res, paths, root.right);paths.remove(paths.size()-1);}}}
复杂度分析
令 n 为数组长度。
- 时间复杂度:
#card=math&code=O%28n%29&id=APHPt)
- 空间复杂度:
#card=math&code=O%28n%29&id=P8bPS)
