实验七 二叉树操作(二)

来源:互联网 发布:phpcms网站源码 编辑:程序博客网 时间:2024/04/29 05:56

实验七   二叉树操作(二)

一、   实验目的

1. 掌握二叉树的创建

2.     掌握二叉树的遍历

3.     掌握二叉树的应用

二、   实验内容

1.前序地创建二叉树ABC##DE#G##F###,实现复制构造函数、、返回树的高、返回结点数、层序遍历二叉树。

2.设计测试步骤,测试以上每个函数。

3.提高部分:遍历硬盘中某个文件夹。

三、   实验环境

1.pc机,windowsxp操作系统

2.VC++6.0软件

 

 

#include<stdio.h>

#include<stdlib.h>

#include<iostream>

using namespacestd;

#define SIZE 50

int leafcount=0;

 

typedef structBiTNode{

    char data;

    struct BiTNode *lchild,*rchild;

}BiTNode,*BiTree;

typedef struct{

 BiTNode *base;

 int front;

 int rear;

 int length;

}Queue,*PQueue;

voidinit_Q(Queue &Q);

void En_Q(Queue&Q,BiTree T);

void De_Q(Queue&Q,BiTree &T);

 

voidLevelOrderTraverse(BiTree T){//层序遍历

 Queue Q;

 init_Q(Q);

 if(T){

  En_Q(Q,T);

 }

 while(Q.front!=Q.rear){

  BiTree temp;

  De_Q(Q,temp);

  putchar(temp->data);

  if(temp->lchild) En_Q(Q,temp->lchild);

  if(temp->rchild) En_Q(Q,temp->rchild);

 }

}

 

voidinit_Q(Queue &Q){

 Q.base=new BiTNode[SIZE];

 Q.front=Q.rear=0;

 Q.length=0;

}

 

void En_Q(Queue&Q,BiTree T){

 if(Q.length==SIZE){

  printf("FULL!\n");

  return;

 }

 Q.base[Q.rear]=*T;

 Q.rear=(Q.rear+1)%SIZE;

 Q.length++;

}

void De_Q(Queue&Q,BiTree &T){

 if(Q.length==0){

  printf("EMPTY!\n");

  return;

 }

 T=&(Q.base[Q.front]);

 Q.front=(Q.front+1)%SIZE;

 Q.length--;

}

 

intCreateBiTree(BiTree *T)/*根据先序序列建立二叉树的二叉链表*/

{ char ch;

    scanf("%c",&ch);

        if(ch=='#')

   {

   *T=NULL;

   }

        else{

           if(!(*T=(BiTree)malloc(sizeof(BiTNode)))) return 0;

            (*T)->data=ch;

            CreateBiTree(&((*T)->lchild));

           CreateBiTree(&((*T)->rchild));

        }

   return 1;

}

 

intpreOrder(BiTree T)/*先序遍历的递归算法*/

 

{

    if(T){

        printf("%c ",T->data);

   if (!T->lchild&&!T->rchild)leafcount+=1;

        preOrder(T->lchild);

        preOrder(T->rchild);

    }

    return 1;

}

 

intinOrder(BiTree T)/*中序遍历的递归算法*/

{

    if(T){

        inOrder(T->lchild);

        printf("%c ",T->data);

        inOrder(T->rchild);

    }

    return 1;

}

 

intoldOrder(BiTree T)/*后序遍历的递归算法*/

{

    if(T){

        oldOrder(T->lchild);

        oldOrder(T->rchild);

        printf("%c ",T->data);

    }

    return 1;

}

int Size(BiTreeT){

//输出节点数

    if(T==NULL)

       return 0;

    else return1+Size(T->lchild)+Size(T->rchild);

 

}

int Hight(BiTreeT)

{

    if(T==NULL)return 0;

    else{

       int i=Hight(T->lchild);

       int j=Hight(T->rchild);

       return (i>j)?i+1:j+1;

    }

}

 

void main()

 

{   BiTree T;

    leafcount=0;

    int n;

 

    printf("请读入字符abc--de-g--f---\n");

 

    CreateBiTree(&T);

 

    printf("先序遍历序列为:");

    preOrder(T);

 

    printf("\n中序遍历序列为:");

    inOrder(T);

 

    printf("\n后序遍历序列为:");

    oldOrder(T);

 

    printf("\n      层序遍历:");

    LevelOrderTraverse(T);

    printf("\n叶子节点:%d\n",leafcount);

   

    printf("所有结点个数");

    n=Size(T);

    printf("%d",n);

    cout<<"\nhigh="<<Hight(T)<<endl;

 

//system("pause");

 

}