课后题 数据结构 ds.05.04.01ds.05.04.03 解答题
第 93 题

在孩子-兄弟表示下,设计算法计算森林叶结点数。给出伪代码、不变量、正确性证明、复杂度和边界情况。

[tag_link]

参考答案

Leaves(t): 空返回0;若 firstchild(t)为空,返回 1+Leaves(nextsibling(t));否则返回 Leaves(firstchild(t))+Leaves(nextsibling(t))。空森林为0,单点为1。

推导过程

不变量:调用 Leaves(t) 返回从 t 开始的兄弟链森林叶数。无孩子时 t 是一棵树的叶,递归计入1并继续兄弟;有孩子时叶子全在孩子森林与兄弟森林,二者不交且完备。每结点至多访问常数次,时间 O(n),递归栈 O(h_cs),最坏 O(n)。

复杂度与边界

时间 O(n),递归栈 O(h_cs),最坏 O(n);空输入与单点边界已说明。

易错点

不能把 nextsibling 当作右孩子,也不能在有孩子时把当前结点计为叶。

评分要点

  • 写出核心结构对应关系或伪代码
  • 给出正确性理由
  • 给出复杂度与边界