P.S 非科班出身,对C++和算法较陌生,从入门开始,使用的是牛客网平台,刷题借鉴了很多前人的思路,博客仅为记录用。
问题4:二叉树中和为某一值的路径【NC8】
问题描述:输入一颗二叉树的根节点root和一个整数expectNumber,找出二叉树中结点值的和为expectNumber的所有路径。
1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点
2.叶子节点是指没有子节点的节点
3.路径只能从父节点到子节点,不能从子节点到父节点
4.总节点数目为
n
n
n
数据范围:树中节点总数在范围
[
0
,
5000
]
[0, 5000]
[0,5000] 内
−
1000
<
=
-1000 <=
−1000<= 节点值
<
=
1000
<= 1000
<=1000
−
1000
<
=
e
x
p
e
c
t
N
u
m
b
e
r
<
=
1000
-1000 <= expectNumber <= 1000
−1000<=expectNumber<=1000
问题要求:无
解题思路:借鉴了网站的思路,使用深度优先搜索。
深度优先搜索思路
(
D
e
p
t
h
−
F
i
r
s
t
(Depth-First
(Depth−First
S
e
a
r
c
h
,
D
F
S
)
Search, DFS)
Search,DFS):
1.使用某一路径探索到底
(
f
o
l
l
o
w
p
a
t
h
u
n
t
i
l
y
o
u
g
e
t
s
t
u
c
k
)
(follow\ path\ until\ you\ get\ stuck)
(follow path until you get stuck);
2.沿着树干回溯直到到达未曾探索的枝干节点
(
b
a
c
k
t
r
a
c
k
a
l
o
n
g
b
r
e
a
d
c
r
u
m
b
s
u
n
t
i
l
r
e
a
c
h
u
n
e
x
p
l
o
r
e
d
n
e
i
g
h
b
o
r
)
(backtrack\ along\ breadcrumbs\ until\ reach\ unexplored\ neighbor)
(backtrack along breadcrumbs until reach unexplored neighbor);
3.递归搜索
(
r
e
c
u
r
s
i
v
e
l
y
e
x
p
l
o
r
e
)
(recursively\ explore)
(recursively explore);
4.注意不要搜索重复的顶点
(
c
a
r
e
f
u
l
n
o
t
t
o
r
e
p
e
a
t
a
v
e
r
t
e
x
)
(careful\ not\ to\ repeat\ a\ vertex)
(careful not to repeat a vertex)
代码:
class Solution {
public:
vector<vector<int>> vect_vector; //结果数组[数组的数组]
vector<int> vect;
vector<vector<int>> FindPath(TreeNode* root,int expectedNumber) {
dfs(root,expectedNumber);
return vect_vector;
}
void dfs(TreeNode* root,int expectedNumber){
if (root == nullptr)
return;
expectedNumber -= root->val;
vect.push_back(root->val); //当前节点
if (root->left == nullptr && root->right == nullptr && expectedNumber == 0){
vect_vector.push_back(vect);
}
dfs(root->left,expectedNumber);
dfs(root->right,expectedNumber);
vect.pop_back();
}
};
注意点:
vector.push_back(num)
表示在向量vector的尾部加上数字num,vector.pop_back()
表示把vector尾部的数字删除;vector.clear()
表示清楚向量中的内容;- 网上未找到
TreeNode* root
的相关资料,我的理解是表示以root为根节点的二叉树的指针;root->val
表示当前节点的值;root->right
表示其右子结点;root->left
表示其右子结点; - 有关nullptr的内容见参考资料3.
- 为什么不能一条路径搜索到底然后再搜索另一条路径:这样就需要记录已经搜索的枝干(内存大),并且每次都要从根节点重新开始搜索(时间长).
参考资料: