首先,几乎每个递归都可以被视为分而治之,因为您将问题拆分为子问题。
其次,请注意您最多访问树的每个节点一次,因此运行时间确实是您希望的 O(n)
- 我刚刚注意到您定义
n
为叶子的数量,而不是节点的数量,但分析仍然有效,因为对于高度的树h
,节点数量是1+3+..+3^h-1 = O(3^h)
并且在h
级别中正好有3^h
叶子。所以算法确实在 ~O(3n)=O(n) 时间内运行
最后一点,我觉得你做的其实很好!但在实践中,我认为在这种情况下编写递归主要是通过“分支”而不是通过级别,这意味着你先深入再深入。为了更清楚地说明这一点,我的意思是,最终代码将如下所示:
def countSpeacialNodes (Node t):
if t doesnt have children: return 0
if t is bigger than its children AND t's biggest child is the middle:
return 1+CSN(t.left)+CSN(t.middle)+CSN(t.right)
else return CSN(t.left)+CSN(t.middle)+CSN(t.right)
所以总结一下,你可以注意到在这里推进到树的深处,然后到树的“宽”,而且没有必要标记节点
希望它有一点帮助