上接前篇数据结构和算法(4)-树
4.3 树的基本算法
4.3.1 getSize()⎯⎯统计(子)树的规模
- 一棵树的规模,等于根节点下所有子树规模之和再加一,也等于根节点的后代总数。
该算法首先通过 firstChild 引用找出根节点的长子,并沿着 nextSibling 引用顺次找到其余的孩子,递归地统计出各子树的规模。最后,只要将所有子树的规模累加起来,再计入
根节点本身,就得到了整棵树的规模。该算法在每个节点上只需花费常数时间,因此若树的规模为 n,则总的时间复杂度为 O(n)。
4.3.2 getHeight()⎯⎯计算节点的高度
- 若 u 是 v 的孩子,则 height(v) ≥ height(u) + 1;
- height(v) = 1 + max height(u);
因此,算法 getHeight(v)也是首先通过 firstChild 引用找出根节点的长子,并沿着 nextSibling引用顺次找到其余的孩子,递归地计算出各子树的高度。最后,只要找出所有子树的最大高度,再计入根节点本身,就得到了根节点的高度(即树高);getHeight(v)算法的运行时间也是 O(n),
4.3.3 getDepth()⎯⎯计算节点的深度
- 若 u 是 v 的孩子,则 depth(u) = depth(v) + 1。
算法 getDepth(v)将从 v 的父亲开始,沿着 parent 指针不断上移,直到深度为 0 的树根。
由于该算法只需访问 v 的所有真祖先,而且在每个节点只需 O(1)时间,故其复杂度为O(depth(v))。
4.3.4 前序、后序遍历
最基本的树遍历算法⎯⎯前序遍历( Preoder trave rsal)和后
序遍历( Postorder traver sal)
算法: PreorderTraversal(v)
输入:树节点v
输出: v所有后代的前序遍历序列
{
if (null != v) {
首先访问并输出v;
for (u = v.getFirstChild(); null != u; u = u.getNextSibling()) //依次
PreorderTraversal(u);//前序遍历v的各棵子树
}
}
算法: PostorderTraversal(v)
输入:树节点v
输出: v所有后代的后序遍历序列
{
if (null != v) {
for (u = v.getFirstChild();