首页 > 其他分享 >17_二叉树的所有路径

17_二叉树的所有路径

时间:2023-12-06 20:12:29浏览次数:28  
标签:paths 17 路径 List 二叉树 null root 节点

二叉树的所有路径

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。

示例 1:

img

输入:root = [1,2,3,null,5]
输出:["1->2->5","1->3"]

示例 2:

输入:root = [1]
输出:["1"]

【思路】题目要求从根节点到叶子的路径,所以需要前序遍历,这样才方便让父节点指向孩子节点,找到对应的路径。本图涉及到回溯,因为我们要把路径记录下来,需要回溯来回退一个路径再进入另一个路径。

递归

1、递归函数参数以及返回值

要传入根节点,记录每一条路径的path,和存放结果集的result,这里递归不需要返回值,代码如下:

void traversal(TreeNode root, List<Integer> path, List<String> result)

2、确定递归终止条件

if (cur == null) {
	终止处理逻辑
}

本题只要找到叶子结点,就开始结束的处理逻辑了(把路径放进result里)。

那么什么时候算是找到了叶子结点呢?是当$cur!=null$,其左右孩子都为空的时候,就找到了叶子结点。所以本题的终止条件是:

if (cur.left == null && cur.right == null) {
	终止处理逻辑
}

3、确定单层递归逻辑

整体代码如下:(看代码可以大致理解,读流程太繁琐了)

递归+回溯

//递归法
class Solution {
    public List<String> binsryTreePaths(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> pths, List<String> res) {
        paths.add(root.val);// 前序遍历,中
        //遇到叶子结点
        if (root.left == null && root.right == null) {
            //输出
            StringBuilder sb = new StringBuilder();//StringBuilder用来拼接字符串,速度更快
            for (int i = 0; i < path.size()-1; i++) {
                sb.append(paths.get(i)).append("->");
            }
            sb.sppend(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);//回溯
        }
    }
}
//方法二
class Solution {
	List<String> result = new ArrayList<>();
	public List<String> binaryTreePaths(TreeNode root) {
		deal(root, "");
		return result;
	}
    public void deal(TreeNode node, String s) {
        if (node == null)
            return;
        if (node.left == null && node.right == null) {
            result.add(new StringBuilder(s).append(node.val).toString());
            return;
        }
        String tmp = new StringBuilder(s).append(node.val).append("->").toString();
        deal(node.left, tmp);
        deal(node.right, tmp);
    }
} 

标签:paths,17,路径,List,二叉树,null,root,节点
From: https://www.cnblogs.com/codingbao/p/17880419.html

相关文章

  • 路径规划算法 - 求解最短路径 - Dijkstra算法
    Dijkstra算法的思想是广度优先搜索(BFS)贪心策略。是从一个顶点到其余各顶点的最短路径算法,节点边是不各自不同的权重,但都必须是正数如果是负数,则需要Bellman-Ford算法如果想求任意两点之间的距离,就需要用Floyd算法求节点0->4的最短路径每次从未标记的节点中选择距离......
  • CVE-2017-7504
    JBoss4.xJBossMQJMS反序列化漏洞(CVE-2017-7504)RedHatJBossApplicationServer是一款JavaEE的开源应用服务器。JBossAS4.x及之前版本中,JbossMQ实现过程的JMSoverHTTPInvocationLayer的HTTPServer1LServlet.java文件存在反序列化漏洞,远程攻击者可借助特制的序列化数据......
  • 从字符串中分离文件路径,文件名及文件扩展名
    从字符串中分离文件路径,文件名及文件扩展名如一个文件:D:\文档\C#BASE\StringBuilder.md要分离出文件路径:D:\文档\C#BASE\文件名:StringBuilder文件扩展名:md这是我们要拿到“\”和“.”这两个字符最后出现的索引stringpath="D:\文档\C#BASE\StringBuilder.md";inti=path.la......
  • CVE-2017-12149
    JBoss5.x/6.x反序列化漏洞(CVE-2017-12149)该漏洞为Java反序列化错误类型,存在于Jboss的HttpInvOKER隔离器中,该过滤器在没有进行任何安全检查的情况下尝试将来自客户端的数据流进行反序列化,从而导致了漏洞。漏洞复现该漏洞出现在/invoker/readonly请求中,服务器将用户提交的POST......
  • iPhone 13/14可升级iOS 17.2 RC准正式版:新增Qi2无线充电
    今天凌晨,苹果面向开发者和公测用户发布了iOS17.2RC准正式版更新,为iPhone13和iPhone14用户解锁了一项重要的新功能:支持Qi2无线充电。iOS17.2RC准正式版升级更新基本上与正式版没有区别,预计iOS17.2正式版下周就会推送升级更新了。本次更新在修复了多个问题的同时,也新增了多......
  • 16_平衡二叉树
    平衡二叉树【题外话】二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数。(从上往下看)二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数。(从下往上看)小疑惑:为什么104.二叉树的最大深度中求的是二叉树的最大深度,也用的是后序遍历。(本质上求解的就是根节......
  • 15_完全二叉树的节点个数
    完全二叉树的节点个数给你一棵完全二叉树的根节点root,求出该树的节点个数。完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第h层,则该层包含1~2h个节点。示......
  • Linux查找java安装路径
    先看java-version$javaversion"1.8.0_111"Java(TM)SERuntimeEnvironment(build1.8.0_111-b14)JavaHotSpot(TM)64-BitServerVM(build25.111-b14,mixedmode)然后:echo$JAVA_HOME不一定有如果没有,那就要找一下先$whichjava/usr/bin/java再找到/usr/bin/java的超链接......
  • JAVA JDK 17--安装及环境配置
      第一步:下载并安装JAVAJDK官网:https://www.oracle.com/java/technologies/downloads/#jdk17-windows我在这里选择的是 windows系统的安装包  JDK17:将JDK放到C盘外无中文与空格下的目录:  (我放在了E盘里) 如下:第一步算是完成了。......
  • nginx版本升级之rpm包-nginx 安全漏洞(CVE-2021-23017)
    nginx安全漏洞(CVE-2021-23017) 原版本nginx-1.19.6-1.el7.ngx.x86_64.rpm 要升级的版本nginx-1.20.1-1.el7.ngx.x86_64.rpm1.下载nginx-1.20.1-1.el7.ngx.x86_64.rpm官网下载地址http://nginx.org/packages/rhel/7/x86_64/RPMS/ 2.安装rpmrpm-Uvhnginx-1.20.1......