若树不空,则二叉树根结点入队,然后当队列不空且队列长不超过n,重复如下操作:出队,若出队元素不为空,则记住其下标,且将其左右子女入队列;若出队元素为空,当作虚结点,也将其“虚子女”入队列。为节省空间,就用树T的顺序存储结构A[1..n]作队列,队头指针front,队尾指针rear,元素最大下标last.
void Traverse(BiTree bt ,int n)
// 求二叉树bt的顺序存储结构A[1..n],下标超过n报错,给出实际的最大下标
{BiTree A[], p;
if(bt!=null)
{int front=0,rear=1,last=1; A[1]=bt;
while(front<=rear)
{p=A[++front]; if(p) last=front; // 出队;用last记住最后一个结点的下标
rear=2*front;//计算结点(包括虚结点)“左子女”下标
if (p) //二叉树的实际结点
{if(rear>n) printf(“%c结点无左子女”); else A[rear]=p->lchild;
if(rear+1>n) printf(“%c结点无右子女”); else A[rear+1]=p->rchild;
}
else //p是虚结点
{ if(rear<=n) A[rear]=null; if(rear+1<=n) A[rear+1]=null; }
}// while(front<=rear)
printf(“实际的最大下标是%d”,last);
}//if(bt!=null) }//Traverse