1 前言
给你一个二叉树的根节点 root
,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
实例1
输入:root = [1,2,3,null,5] 输出:["1->2->5","1->3"]
2 实现
以下图的二叉树为例:
2.1 分析
有于需要从上到下遍历二叉树,因此遍历方式选择深度遍历;路径为从根节点到叶子节点(中左右),因此选择前序遍历。
【第一步】先处理中节点,如果节点不为空,则加入到List集合中,直到找到叶子节点。找到叶子节点后循环List集合进行输出。
【第二步】左叶子节点不为空 进行递归与回溯
【第三步】右叶子节点不为空进行递归与回溯。
2.2 代码
package cn.msf.tree;
import com.sun.org.apache.bcel.internal.generic.IF_ACMPEQ;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
/**
* @author : msf
* @date : 2022/12/9
*/
public class BinaryTreePaths {
public static void main(String[] args) {
TreeNode root = new TreeNode(1);
TreeNode node1 = new TreeNode(2);
TreeNode node2 = new TreeNode(3);
TreeNode node3 = new TreeNode(4);
TreeNode node4 = new TreeNode(5);
TreeNode node5 = new TreeNode(6);
TreeNode node6 = new TreeNode(7);
root.left = node1;
root.right = node2;
node1.left = node3;
node1.right = node4;
node2.left = node5;
node2.right = node6;
List<String> strings = new BinaryTreePaths().binaryTreePaths(root);
System.out.println(strings);
}
List<String> result = new ArrayList<>();
List<String> path = new ArrayList<>();
// 要考虑回溯,采用前序遍历法。
public List<String> binaryTreePaths(TreeNode root) {
if (root == null) {
return null;
}
traverse(root);
return result;
}
private void traverse(TreeNode root) {
// 中
path.add(root.value + "");
if (root.left == null && root.right == null) {
// 是叶子节点--path存放了节点
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < path.size() - 1; i++) {
stringBuilder.append(path.get(i)).append("->");
}
stringBuilder.append(path.get(path.size()-1));
result.add(stringBuilder.toString());
return;
}
// 左
if (root.left != null) {
traverse(root.left);
path.remove(path.size()-1);
}
// 右
if (root.right != null) {
traverse(root.right);
path.remove(path.size()-1);
}
}
}
上述代码执行结果如下: