主题
二叉树路径问题题目
某一个节点(不一定是根节点),从上向下寻找路径,到某一个节点(不一定是叶节点)结束,采用 dfs 解决
一般路径 模板
js
const res = []
const dfs = (root, path) => {
if (!root) return // 根节点为空直接返回
path.push(root.val) // 做出选择
if (!root.left && !root.right) { // 如果到叶节点
res.push([...path])
return
}
//继续递归
dfs(root.left, path)
dfs(root.right, path)
path.pop() // 撤销选择
}
给定和路径 模板
js
const res = []
const dfs = (root, sum, path) => {
if (!root) return // 根节点为空直接返回
// 做出选择
sum -= root.val
path.push(root.val)
if (!root.left && !root.right && sum === 0) { // 如果到叶节点
res.push([...path])
return
}
//继续递归
dfs(root.left, sum, path)
dfs(root.right,sum, path)
// 撤销选择
path.pop()
}
257. 二叉树的所有路径
这里注意 -> 放在递归中,其他的就是一般路径模板
typescript
function binaryTreePaths(root: TreeNode | null): string[] {
const res: string[] = []
const dfs = (root: TreeNode, s: string) => {
if (!root) return
s += root.val
if (!root.left && !root.right) {
return res.push(s)
}
dfs(root.left, s + '->')
dfs(root.right, s + '->')
}
dfs(root, '')
return res
};
113. 路径总和 II
直接给定和路径模板
typescript
function pathSum(root: TreeNode | null, targetSum: number): number[][] {
const res: number[][] = []
const dfs = (root: TreeNode, sum: number, s: string) => {
if (!root) return
sum -= root.val
s += root.val
if (!root.left && !root.right && sum === 0) {
return res.push(s.split('#').map((i) => Number(i)))
}
dfs(root.left, sum, s + '#')
dfs(root.right, sum, s + '#')
}
dfs(root, targetSum, '')
return res
};
437. 路径总和 III
给定和路径模板
- 不是跟节点开始的,都需要双重递归
- 不需要在叶子节点结束,因为可能为 0,或负数,所以达到给定和后,不需要 return,继续向下递归
typescript
function pathSum(root: TreeNode | null, targetSum: number): number {
let res = 0
const dfs = (root: TreeNode) => {
if (!root) return
dfs2(root, targetSum)
dfs(root.left)
dfs(root.right)
}
const dfs2 = (root: TreeNode, sum: number) => {
if (!root) return
sum -= root.val
if (sum === 0) res++
dfs2(root.left, sum)
dfs2(root.right, sum)
}
dfs(root)
return res
};
换汤不换药,套用一般路径模板
typescript
function smallestFromLeaf(root: TreeNode | null): string {
const res: string[] = []
const dfs = (root: TreeNode, s: string) => {
if (!root) return
s += String.fromCharCode(97 + root.val)
if (!root.left && !root.right) {
return res.push([...s].reverse().join(''))
}
dfs(root.left, s)
dfs(root.right, s)
}
dfs(root, '')
return res.sort()[0]
};