template <typename T> template <typename VST> //元素类型、操作器
void BinNode<T>::travLevel(VST& visit) //二叉树层次遍历算法
{
Queue<BinNodePosi(T)> Q; //辅助队列
Q.enqueue(this);
while (!Q.empty())
{
BinNodePosi(T) x = Q.dequeue(); visit(x->data);
if (HasLChild(*x)) Q.enqueue(x->lChild); //左孩子入队
if (HasRChild(*x)) Q.enqueue(x->rChild); //右孩子入队
}
}
考虑如上对于二叉树的层次遍历方法,设二叉树只有n个顶点,求证:
a)只要辅助队列的Q的容量不低于 ⌈n/2⌉ ,就不至于出现中途溢出问题;
访问一个节点指从队列中取出一个顶点,访问,并将该节点的子节点加入队列中。
容易验证当访问的节点度数为0、1、2时,对队列中节点个数的影响分别是 -1、不变、+1。故在按从上到下、从左到右的顺序依次访问各个节点时,队列中节点的个数会随之波动。
假设n个节点的二叉树最多有m个二度节点,且这m个二度节点连续地处于层次访问顺序的开始,那访问n个节点的二叉树时队列中最多有m+1个节点(初始时队列中只有根节点,随后每访问一个二度节点队列中节点数量加一,直至二度节点访问完毕到达峰值)。
具有n个节点的二叉树中所有节点的度(入度)之和为 n-1,最多具有⌊(n-1)/2⌋个二度节点。完全二叉树就是二度节点最多的情况,且它的二度节点都处于层次访问顺序开始。由上段的分析,访问具有n个节点的二叉树时,队列中最多具有
m+1=⌊(n-1)/2⌋+1=⌈n/2⌉个节点。
得证。