[AcWing]47. 二叉树中和为某一值的路径
[AcWing]47. 二叉树中和为某一值的路径
输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。
从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
保证树中结点值均不小于 0
。
数据范围
树中结点的数量 [0,1000]
。
样例
1 |
|
算法思路
DFS的过程中,在遇到叶子节点的时候进行累加求和,并且提交path
作为ans
之一。
代码实现
1 |
|
1 |
|
在DFS过程中,上面这两行到底怎么理解?
DFS的过程中,可以用函数调用栈来表示。如果调用四次DFS,则有四个DFS压入栈中,path
也会有四个节点的值。在DFS出栈的过程中,如果不恢复现场,则会出现函数调用栈空了,但path的里面值依旧没有减少
。
归根结底,四次DFS,path
会加入四个节点的值,通过path.pop_back()
会清除掉这四个节点的值。这样能够保证DFS在结束一个分支,再次开启新的分支的时候path
是干净的。
时间复杂度分析
- 最坏时间复杂度
O(n<sup>2</sup>)
:在最坏情况下,树的上半部分为链状,下半部分为完全二叉树,并且从根节点到每一个叶子节点的路径都符合题目要求。路径的数目为O(n)
,并且每一条路径的节点个数也为 O(n)。要想将n个路径的所有节点都统计起来,需要的时间复杂度是O(n<sup>2</sup>)
。 - 平均时间复杂度
O(n)
:由于每个节点最多只会被访问一次,所以时间复杂度是O(n)
。
但是注意:在大多数情况下,二叉树不会退化成链表,因此大部分情况下的时间复杂度都是线性的。
我认为时间复杂度还是能看做O(n)
。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Phbeats-Blog!
评论