(1)二叉树采用链式存储结构,试设计一个算法,计算一棵给定二叉树的所有节点数并上机实现。
(2)假设二叉树采用二叉链存储结构表示,编写一个二叉树先序遍历的非递归算法并上机实现。
(3)假设二叉树采用二叉链存储结构表示,编写一个二叉树后序遍历的非递归算法并上机实现。
(1)对应的算法如下:
int nodes(BTree *b)
{
int num1, num2;
if(b==NULL)
return(0);
else
{
num1=nodes(b->lchild);
num2=nodes(b->rchild);
return(num1+num2+1);
}
}
(2)使用一个栈St,首先将根节点入栈,开始循环,从栈中退出当前节点p,先访问它,然后将其右节点入栈,再将其左节点入栈,如此直到栈空为止。算法如下:
void porder(BTNode *b)
{
BTNode *St[MaxSize],*p;
int top=1;
if(b!=NULL)
{
top++; /*根节点入栈*/
St[top]=b;
while(top>-1) /*栈不为空时循环*/
{
p=St[top]; /*退栈并访问该节点*/
top--;
printf("%c ",p->data);
if (p->rchild!=NULL) /*右孩子入栈*/
{
top++;
St[top]=p->rchild;
}
if (p->lchild!=NULL) /*左孩子入栈*/
{
top++;
St[top]=p->lchild;
}
}
}
}
(3)按后序遍历二叉树需要使用栈来实现。每个节点要等到遍历左、右子树之后才能访问,所以在遍历左、右子树之前节点都需要进栈,为了区分二者,除设节点栈s外,另设一个标记栈b,标记“0”表示节点在遍历左子树时进栈,标记“1”表示节点在遍历右子树时进栈。算法描述如下:
# define MAX 1000
void postorder (BTnode *t)
{
BTnode *s[MAX],*p=t;
int b[MAX],top=-1;
do
{
while(p)
{
s[++top]=p;
b[top]=0;
p=p->lchild;
}
while(top>-1&&b[top]==1)
{
p=s[top--];
printf("%c",p->data);
}
if(top>-1)
{
p=s[top]->rchild;
b[top]=1;
}
}while(top>-1);
}