如果一个节点为其父节点的轻儿子,那么我们称其为轻节点。所有轻节点会在清除统计时遍历一遍其子树,所以每个节点被遍历的次数为其到根节点路径上的轻节点的数量加一(加一是因为 dfs 本身会遍历一遍)。由于轻节点的子树大小至多为其父节点的的一半,所以任意节点到根节点的路径上的轻节点数量最多为 logn,所以每个点被遍历的次数为 O(logn),所以总体的时间复杂度为 O(nlogn)。
多说一嘴为什么这个算法没有任何合并操作却被叫做“启发式合并”,因为他和真正的“启发式合并”有着类似的过程:如果我们先遍历重儿子,那么合并时永远是从轻儿子合并到重儿子上,所以我们合并时就相当于遍历了一遍轻儿子的子树(类比于清除轻儿子统计),所以“启发式合并”的时间复杂度也是 O(nlogn)。