前序之二叉树的所有路径
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);
}
要注意,最后一行代码,是回溯代码。画个图就明白了。
如果大家觉得写得不错,不妨关注一下,您的认可是给我最大的鼓励。
以上是关于前序之二叉树的所有路径的主要内容,如果未能解决你的问题,请参考以下文章