二叉树的所有路径
- leetcode257. 二叉树的所有路径
- 题目描述
- DFS深度优先遍历
- 二叉树专题
leetcode257. 二叉树的所有路径
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/binary-tree-paths
题目描述
给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
示例1:
输入:root = [1,2,3,null,5]
输出:[“1->2->5”,“1->3”]
示例 2:
输入:root = [1]
输出:[“1”]
提示:
树中节点的数目在范围 [1, 100] 内
-100 <= Node.val <= 100
DFS深度优先遍历
最直观的方法是使用深度优先搜索。在深度优先搜索遍历二叉树时,我们需要考虑当前的节点以及它的孩子节点。
如果当前节点不是叶子节点,则在当前的路径末尾添加该节点,并继续递归遍历该节点的每一个孩子节点。
如果当前节点是叶子节点,则在当前路径末尾添加该节点后我们就得到了一条从根节点到叶子节点的路径,将该路径加入到答案即可。
如此,当遍历完整棵二叉树以后我们就得到了所有从根节点到叶子节点的路径。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
List<String> ans = new ArrayList<>();
public List<String> binaryTreePaths(TreeNode root) {
process(root,"");
return ans;
}
/**
* dfs 深度优先遍历 前序遍历
* path 记录链路
*/
public void process(TreeNode root , String path){
if(root == null){
return;
}
StringBuilder sb = new StringBuilder(path);
//前序遍历加进去
sb.append(Integer.valueOf(root.val));
//遇到叶子节点 加入到答案里
if(root.left == null && root.right == null){
ans.add(sb.toString());
}else{
//两个数字之间加上 ->
sb.append("->");
process(root.left,sb.toString());
process(root.right,sb.toString());
}
}
}
二叉树专题
leetcode111. 二叉树的最小深度
leetcode2385. 感染二叉树需要的总时间
leetcode222. 完全二叉树的节点个数
leetcode199. 二叉树的右视图
leetcode652. 寻找重复的子树
leetcode450. 删除二叉搜索树中的节点
leetcode701. 二叉搜索树中的插入操作