前序之二叉树的所有路径

Posted Yuning算法

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了前序之二叉树的所有路径相关的知识,希望对你有一定的参考价值。

这周比较忙,有好几天没有写公众号,今天抽空写上一篇。
今天讲下二叉树的所有路径。


A

题目描述


题目描述如下:

给定一个二叉树,返回所有从根节点到叶子节点的路径。

说明: 叶子节点是指没有子节点的节点。

如上图从根结点1到叶节点总共有两条路径:

1 -> 2 -> 5 以及 1 -> 3

函数返回两个列表:

[[1 -> 2 -> 5],[1 -> 3]]

函数签名:public List<String> binaryTreePaths(TreeNode root)


B

题目分析


首先确定遍历的方式:

很明显,这里需要采用前序遍历,前序是自顶向下,一路走到黑,直到碰到叶子结点。

当碰到叶子节点的时候,我们将走过的路径保存下来。

原函数签名是:public List<String> binaryTreePaths(TreeNode root)

输入的是根节点,输出的是路径。

我们真正工作的函数不采用上述方法,我们定义一个Helper函数,这是常用的技巧。

我们确定递归的三个步骤:

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

我们定义函数签名如下:

public void binaryTreePathsHelper(TreeNode root, String buffer, ArrayList<String> results)

参数root是树的根节点

buffer记录当前走过的路径

results保存当走到叶节点时,保存的结果集。

2、确定终止条件

因为题目要求是遇到叶节点算一条路径,因此终止条件就是判断到了叶节点.

      if (root.left == null && root.right == null) {       doSomething(); return;      }


3、确定当前节点需要做的事情

当前节点需要做的事情就是将该节点记录到buffer路径之中。

即:

buffer += root.val + "->";

剩下的事情就是递归调用即可


C

代码分析

 public List<String> binaryTreePaths(TreeNode root) { if (root == null) { return new ArrayList<>(); }
// 保存走过的路径 String buffer = new String(); // 保存路径结果 ArrayList<String> results = new ArrayList<>(); // 开始递归调用 binaryTreePathsHelper(root, buffer, results); return results; }
public void binaryTreePathsHelper(TreeNode root, String buffer, ArrayList<String> results) { // 递归结束条件,遇到根节点 if (root.left == null && root.right == null) { buffer += root.val; // 由于(1)处代码在递归结束条件后面,因此叶节点需要加进来 results.add(new String(buffer.toString())); // 这样处理的好处是,叶节点不用处理 “->” // 注意上面一定要new一个新的String return; }
// 将该节点加入到路径之中 buffer += root.val + "->"; // 注意:(1) // 递归遍历左孩子 if (root.left != null) binaryTreePathsHelper(root.left, buffer, results); // 递归遍历右孩子 if (root.right !=null ) binaryTreePathsHelper(root.right, buffer, results); // 回溯,当返回上层时,去掉最后一个节点 buffer = buffer.substring(0, buffer.length() - 1); }


要注意,最后一行代码,是回溯代码。画个图就明白了。




如果大家觉得写得不错,不妨关注一下,您的认可是给我最大的鼓励。


以上是关于前序之二叉树的所有路径的主要内容,如果未能解决你的问题,请参考以下文章

二叉树经典题之二叉树的非递归遍历

笔试常考题型之二叉树的遍历

LeetCode刷题之二叉树的前序遍历

❤️算法系列之二叉树的实现(包含前序中序后序遍历以及节点的查找和删除)❤️

数据结构之二叉树的基础OJ练习二叉树的遍历

二叉树篇章之二