您的位置: 网站首页 > 程序开发 > 数据结构 > 第5章 树与二叉树 > 【5.10 上 机 实 验】

5.10 上 机 实 验

 

5.10 

5.10.1  实验内容

1)二叉树采用链式存储结构,试设计一个算法,计算一棵给定二叉树的所有节点数并上机实现。

2)假设二叉树采用二叉链存储结构表示,编写一个二叉树先序遍历的非递归算法并上机实现。

3)假设二叉树采用二叉链存储结构表示,编写一个二叉树后序遍历的非递归算法并上机实现。

5.10.2  实验指导

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);

}