第六次作业:二叉树

这个作业属于哪个课程 https://edu.cnblogs.com/campus/qdu/DS2020
这个作业要求在哪里 https://edu.cnblogs.com/campus/qdu/DS2020/homework/11430
这个作业的目标 掌握二叉树
学号 2018204219

 

一、实验目的
1、掌握二叉树的基本特性
2、掌握二叉树的先序、中序、后序的递归遍历算法
3、理解二叉树的先序、中序、后序的非递归遍历算法
4、通过求二叉树的深度、叶子结点数和层序遍历等算法,理解二叉树的基本特性

二、实验预习
说明以下概念
1、二叉树:

2、递归遍历:

3、 非递归遍历:

4、层序遍历:

三、实验内容和要求
1、阅读并运行下面程序,根据输入写出运行结果,并画出二叉树的形态。

#include<malloc.h>
#define MAX 20
typedef struct BTNode{       /*节点结构声明*/
    char data ;               /*节点数据*/
    struct BTNode *lchild;
    struct BTNode *rchild ;  /*指针*/
}*BiTree;

void createBiTree(BiTree *t){ /* 先序遍历创建二叉树*/
    char s;
    BiTree q;
    printf("\nplease input data:(exit for #)");
    s=getche();
    if(s=='#'){*t=NULL; return;}
    q=(BiTree)malloc(sizeof(struct BTNode));
    if(q==NULL){printf("Memory alloc failure!"); exit(0);}
    q->data=s;
    *t=q;
    createBiTree(&q->lchild); /*递归建立左子树*/
    createBiTree(&q->rchild); /*递归建立右子树*/
}

void PreOrder(BiTree p){  /* 先序遍历二叉树*/
    if ( p!= NULL ) {
           printf("%c", p->data);
           PreOrder( p->lchild ) ;
           PreOrder( p->rchild) ;
    }
}
void InOrder(BiTree p){  /* 中序遍历二叉树*/
    if( p!= NULL ) {
      InOrder( p->lchild ) ;
        printf("%c", p->data);
        InOrder( p->rchild) ;
    }
}
void PostOrder(BiTree p){  /* 后序遍历二叉树*/
   if ( p!= NULL ) {
        PostOrder( p->lchild ) ;
           PostOrder( p->rchild) ;
           printf("%c", p->data);
    }
}

void Preorder_n(BiTree p){ /*先序遍历的非递归算法*/
    BiTree stack[MAX],q;
    int top=0,i;
    for(i=0;i<MAX;i++) stack[i]=NULL;/*初始化栈*/
    q=p;
    while(q!=NULL){
        printf("%c",q->data);
        if(q->rchild!=NULL) stack[top++]=q->rchild;
        if(q->lchild!=NULL) q=q->lchild;
        else
            if(top>0) q=stack[--top];
            else q=NULL;
    }
}

void release(BiTree t){ /*释放二叉树空间*/
      if(t!=NULL){
        release(t->lchild);
        release(t->rchild);
        free(t);
      }
}

int main(){
    BiTree t=NULL;
    createBiTree(&t);
    printf("\n\nPreOrder the tree is:");
    PreOrder(t);
    printf("\n\nInOrder the tree is:");
    InOrder(t);
    printf("\n\nPostOrder the tree is:");
    PostOrder(t);
    printf("\n\n先序遍历序列(非递归):");
    Preorder_n(t);
    release(t);
    return 0;
}

运行程序
输入:

ABC##DE#G##F###
  • 运行结果:

     

     

2、在上题中补充求二叉树中求结点总数算法(提示:可在某种遍历过程中统计遍历的结点数),并在主函数中补充相应的调用验证正确性。
算法代码:

算法代码

int PreOrder_num(BiTree p){

int j=0;

      BiTree stack[MAX],q;

    int top=0,i;

    for(i=0;i<MAX;i++) stack[i]=NULL;/*初始化栈*/

    q=p;

    while(q!=NULL){

j++;0

        

        if(q->rchild!=NULL) stack[top++]=q->rchild;

        if(q->lchild!=NULL) q=q->lchild;

        else

            if(top>0) q=stack[--top];

            else q=NULL;

    }

return j;

}

 

 

 

3、在上题中补充求二叉树中求叶子结点总数算法(提示:可在某种遍历过程中统计遍历的叶子结点数),并在主函数中补充相应的调用验证正确性。

算法代码:

int BTNodeDepth(BiTree p){

int lchilddep,rchilddep;

if(p==NULL)

return 0;

else{

        lchilddep=BTNodeDepth(p->lchild);

        rchilddep=BTNodeDepth(p->rchild);

return(lchilddep>rchilddep)(lchilddep+1):(rchilddep+1);

}

 

 

4、在上题中补充求二叉树深度算法,并在主函数中补充相应的调用验证正确性。

算法代码:

int BTNodeDepth(BiTree p){

int lchilddep,rchilddep;

if(p==NULL)

return 0;

else{

        lchilddep=BTNodeDepth(p->lchild);

        rchilddep=BTNodeDepth(p->rchild);

return(lchilddep>rchilddep)(lchilddep+1):(rchilddep+1);

}

}

 

 

选做实验:(代码可另附纸)
4、 补充二叉树层次遍历算法。(提示:利用队列实现)

5、补充二叉树中序、后序非递归算法。

posted @ 2020-10-31 14:34  聂小倩  阅读(460)  评论(0)    收藏  举报