一、题目描述:
给定一个二叉树,返回所有从根节点到叶子节点的路径。 说明: 叶子节点是指没有子节点的节点。
示例:
输入:
1
/ \
2 3
\
5
输出: ["1->2->5", "1->3"]
解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3
引自:leetcode-cn.com/problems/bi…
题目链接:257. 二叉树的所有路径
二、思路分析:
- 需要一个数组保存所有的路径字符串,深度遍历每一个路径字符串 并且放入数组
- 递归深度优先遍历左右子树,并且拼接结点值;直到叶子结点的左右子树为空,就停止遍历。
三、AC 代码:
class Solution {
func binaryTreePaths(_ root: TreeNode?) -> [String] {
if (root == nil) {
// 空树
return [String]();
}
// 只有根结点的树
if (root!.left == nil && root!.right == nil) {
return ["\(root!.val)"];
}
// 记录路径的数组
var pathsArray = [String]()
// String拼接
let path:String = "\(root!.val)";
dfsLeftRightSubTree((root?.left), pathsArray: &pathsArray, path: path);
dfsLeftRightSubTree((root?.right), pathsArray: &pathsArray, path: path);
return pathsArray;
}
// 深度优先遍历 Depth-First-Search
// 深度优先遍历左右子树
func dfsLeftRightSubTree(_ node: TreeNode?, pathsArray: inout [String], path: String) -> [String] {
if (node == nil) {
return [];
}
var tempPath = path;
if (node?.left == nil && node?.right == nil) {
pathsArray.append("\(tempPath)->\(node!.val)");
} else {
tempPath = "\(path)->\(node!.val)";
dfsLeftRightSubTree(node?.left, pathsArray: &pathsArray, path: tempPath);
dfsLeftRightSubTree(node?.right, pathsArray: &pathsArray, path: tempPath);
}
return pathsArray;
}
}
四、参考学习网址
本文正在参与「掘金 3 月闯关活动」, 点击查看 活动详情