这是悦乐书的第199次更新,第206篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第62题(顺位题号是257)。给定二叉树,返回所有根到叶路径。例如:

输入:

  1
/ \
2 3
\
5

输出:[“1-> 2-> 5”,“1-> 3”]

说明:所有根到叶路径是:1-> 2-> 5, 1-> 3

注意:叶子是没有子节点的节点。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

特殊情况:当根节点为null的时候,直接返回空数组。

正常情况:深度遍历,从根节点开始,依次从左节点开始,一直往左节点遍历进去,直到遇到叶子节点,此时就构成一条完整的路径,而其相邻的右叶子结点,以及从根节点开始的右节点,这些都是一条完整的路径。

public List<String> binaryTreePaths(TreeNode root) {
List<String> list = new ArrayList<String>();
if (root == null) {
return list;
}
helperFun(root, list, "");
return list;
} public void helperFun(TreeNode root, List<String> list, String path) {
if (root.left != null) {
helperFun(root.left, list, path + root.val + "->");
}
if (root.right != null) {
helperFun(root.right, list, path + root.val + "->");
}
if (root.left == null && root.right == null) {
list.add(path + root.val);
}
}

03 第二种解法

此解法也是利用递归,递归虽然写在方法内部了,但是思路和上面第一种解法的递归是一样的。

public List<String> binaryTreePaths2(TreeNode root) {
List<String> list = new ArrayList<String>();
if (root == null) {
return list;
}
if (root.left == null && root.right == null) {
list.add(root.val+"");
return list;
}
for (String path : binaryTreePaths(root.left)) {
list.add(root.val+"->"+path);
}
for (String path : binaryTreePaths(root.right)) {
list.add(root.val+"->"+path);
}
return list;
}

04 第三种解法

使用迭代的方法,借助两个栈,一个存储节点信息,一个存储路径信息。

public List<String> binaryTreePaths3(TreeNode root) {
List<String> list = new ArrayList<String>();
Stack<TreeNode> sNode = new Stack<TreeNode>();
Stack<String> sStr = new Stack<String>();
if (root == null){
return list;
}
sNode.push(root);
sStr.push("");
while (!sNode.isEmpty()) {
TreeNode curNode = sNode.pop();
String curStr = sStr.pop();
if (curNode.left == null && curNode.right == null) {
list.add(curStr + curNode.val);
}
if (curNode.left != null) {
sNode.push(curNode.left);
sStr.push(curStr + curNode.val + "->");
}
if (curNode.right != null) {
sNode.push(curNode.right);
sStr.push(curStr + curNode.val + "->");
}
}
return list;
}

05 小结

算法专题目前已连续日更超过一个月,算法题文章62+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-Binary Tree Paths(Java实现-3种解法)的更多相关文章

  1. LeetCode算法题-Number Complement(Java实现-五种解法)

    这是悦乐书的第240次更新,第253篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第107题(顺位题号是476).给定正整数,输出其补码数.补充策略是翻转其二进制表示的位 ...

  2. LeetCode算法题-Move Zeroes(Java实现-三种解法)

    这是悦乐书的第201次更新,第211篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第67题(顺位题号是283).给定一个数组nums,写一个函数将所有0移动到它的末尾,同 ...

  3. LeetCode算法题-Missing Number(Java实现-四种解法)

    这是悦乐书的第200次更新,第209篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第65题(顺位题号是268).给定一个包含n个不同数字的数组,取自0,1,2,...,n ...

  4. LeetCode算法题-Ugly Number(Java实现-四种解法)

    这是悦乐书的第199次更新,第208篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第64题(顺位题号是263).编写一个程序来检查给定的数字是否是一个丑陋的数字.丑陋的数 ...

  5. LeetCode算法题-Add Digits(Java实现-3种解法)

    这是悦乐书的第199次更新,第207篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第63题(顺位题号是258).给定非负整数num,重复添加其所有数字,直到结果只有一位数 ...

  6. LeetCode算法题-Binary Tree Tilt(Java实现)

    这是悦乐书的第263次更新,第276篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第130题(顺位题号是563).给定二叉树,返回整棵树的倾斜度.树节点的倾斜被定义为所有 ...

  7. LeetCode算法题-Binary Tree Level Order Traversal II(Java实现)

    这是悦乐书的第165次更新,第167篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第24题(顺位题号是107).给定二叉树,返回其节点值的自下而上级别顺序遍历(即从左到右 ...

  8. LeetCode算法题-Symmetric Tree(Java实现)

    这是悦乐书的第163次更新,第165篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第22题(顺位题号是101).给定二叉树,检查它是否是自身的镜像(即,围绕其中心对称). ...

  9. LeetCode算法题-Binary Search(Java实现)

    这是悦乐书的第297次更新,第316篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第165题(顺位题号是704).给定n个元素的排序(按升序)整数数组nums和目标值,编 ...

随机推荐

  1. Go基础系列:Go中的方法

    Go方法简介 Go中的struct结构类似于面向对象中的类.面向对象中,除了成员变量还有方法. Go中也有方法,它是一种特殊的函数,定义于struct之上(与struct关联.绑定),被称为struc ...

  2. advanced installer重新打包教程

    一.简介 本次利用Advanced Installer软件里的Repackager重封装工具进行测试制作MSI安装包,还开可以利用Advanced Installerr制作MSI安装包 原理为执行两次 ...

  3. SpringBoot学习(五)-->SpringBoot的核心

    SpringBoot的核心 1.入口类和@SpringBootApplication Spring Boot的项目一般都会有*Application的入口类,入口类中会有main方法,这是一个标准的J ...

  4. Android Studio 使用Intent

    1.显式Intent Intent intent=new Intent(yzj.this,MainActivity.class);//当前活动的实例,要去的实例 startActivity(inten ...

  5. java关于字符串的一些实用操作工具类方法

    package cn.edu.stdu; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.Se ...

  6. 修改CentOS服务器时间为北京时间

    购买了VPS,CentOS系统,发现服务器时间与北京时间往往不一致,存在时差. [clive@server workspace]$ date 2018年 05月 30日 星期三 02:02:47 UT ...

  7. Laravel 系列入门教程(四)【最适合中国人的 Laravel 教程】

    本篇文章中,我将跟大家一起实现 Article 的新增.编辑和删除功能,仔细解读每一段代码,相信本篇文章看完,你就能够 get Laravel 使用之道. RESTful 资源控制器 资源控制器是 L ...

  8. JavaScript解析机制与闭包原理实例详解

    js代码解析机制: js代码解析之前会创建一个如下的词法环境对象(仓库):LexicalEnvironment{ } 在扫描js代码时会把: 1.用声明的方式创建的函数的名字; 2.用var定义的变量 ...

  9. canvas-8clip.html

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. git pull遇到错误:error: Your local changes to the following files would be overwritten by merge:

    方法1:如果你想保留刚才本地修改的代码,并把git服务器上的代码pull到本地(本地刚才修改的代码将会被暂时封存起来) git stash git pull origin master git sta ...