二叉树的所有路径(所有从根节点到叶子节点的路径)-257
1.对称二叉树-101
2.二叉树的所有路径(所有从根节点到叶子节点的路径)-257
3.左叶子之和-4044.找树左下角的值-5135.路径总和-1126.从中序与后序遍历序列构造二叉树-1067.二叉搜索树的最小绝对差值-503题目描述
给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
解题思路
这道题我们采用二叉树里的前序遍历方式,我们要遍历所有到叶子节点的路径,我们采用复用的思想,就是让这里的几个数据结构我们可以重复使用,但是重复使用也就带来数据不一致的情况,我们用一个temp集合来存储遍历路上遇到的元素,但是这里的元素我们肯定是要变化的,你遍历了左叶子节点,那下次你遍历右叶子节点的时候你就要把左叶子节点的值给从我们这个temp集合中去除,所以这里就体现了回溯的思想,一层一层的往上回溯,直到最后回溯的只剩下了根节点,然后再同样的方法去遍历根节点的右子树。
代码实例
class Solution {
public List<String> binaryTreePaths(TreeNode root) {
List<String> result = new ArrayList<>();
List<Integer> temp = new ArrayList<>();
travel(root, temp, result);
return result;
}
public void travel(TreeNode root, List<Integer> temp, List<String> result) {
temp.add(root.val);
if (root.left == null && root.right == null) {
result.add(zhuanhua(temp));
return;
}
if (root.left != null) {
travel(root.left, temp, result);
//这里就是回溯的思想,先让底下的节点一层一层遍历然后回溯去除相应的值,再到这里的根节点就只剩下了根节点,然后就可以去遍历右子树了
temp.remove(temp.size()- 1);
}
if (root.right != null) {
travel(root.right, temp, result);
temp.remove(temp.size()- 1);
}
}
public String zhuanhua(List<Integer> num) {
String sl = "";
for (int i = 0; i < num.size(); i++) {
if (i != num.size() - 1) {
sl += (num.get(i) + "->");
} else {
sl += num.get(i);
}
}
return sl;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)