abc的先序二叉树

来源:互联网 发布:10月经济数据 统计局 编辑:程序博客网 时间:2024/06/08 19:40

先序序列:abc

中序序列:bac

后序序列:bca

层次序列:abc

 

1.    工程的建立

头文件

 typedef char TElemType;

typedef int Status;

#defineMAX 100

typedef struct BiTNode{

    TElemTypedata;

    struct BiTNode *lchild,*rchild;

}BiTNode,*BiTree;

 

Status CreateBiTree(BiTree &T);   //按照先序次序输入二叉树中的结点的值(一个字符),空格字符表示空树。

Status PreOrderTraverse(BiTree T,Status(*Visit)(TElemType e));   // 先序遍历二叉树。

Status InOrderTraverse(BiTree T,Status(*Visit)(TElemType e));    //中序遍历二叉树。

Status PostOrderTraverse(BiTree T,Status(*Visit)(TElemType e));  //后续遍历二叉树

Status LevelOrderTraverse(BiTreeT,Status (*Visit)(TElemType e)); //层次遍历二叉树

Status Visit(TElemType e); 

Status Length(BiTree T);  //树深度

StatusCountNode(BiTree T); //树的结点总数

主函数

// Tree.cpp : Defines theentry point for the console application.

//

 

#include "stdafx.h"

#include "tree.h"

 

using namespace std;

intmain(int argc,char*argv[])

{

    //printf("Hello World!\n");

    BiTreeT;

    int c,l=0;

    printf("输入二叉树:\n");

   CreateBiTree(T);

    printf("按照先序排序:\n");

    PreOrderTraverse(T,Visit);

    printf("\n按照中序排序:\n");

   InOrderTraverse(T,Visit);

    printf("\n按照后序排序:\n");

   PostOrderTraverse(T,Visit);

   printf("\n按照层次排序:\n");

   c=LevelOrderTraverse(T,Visit);

    l=Length(T);

    printf("\n");

    printf("\n树的深度为:%d\n",l);

    l=CountNode(T);

    printf("\n树的结点总数;%d\n",l);

    system("pause");

    return 0;

}

 

内容:

二叉树的创建

Status CreateBiTree(BiTree &T)   //按照先序次序输入二叉树中的结点的值(一个字符),空格字符表示空树。

{

   char ch;

    cin.get(ch);

    if(ch==' ')

       T=NULL;

    else

    {

       if(!(T=(BiTree)malloc(sizeof(BiTNode))))

           exit(OVERFLOw);

         T->data=ch;

        CreateBiTree(T->lchild);

        CreateBiTree(T->rchild);

    }

    return OK;

}

 

 

该二叉树采用先序输入(注:要输入对应的空格)

先序遍历二叉树

Status PreOrderTraverse(BiTree T,Status(*Visit)(TElemType e))   // 先序遍历二叉树。

{

   if(T)

    {

       if(Visit(T->data))

           if(PreOrderTraverse(T->lchild,Visit))

              if(PreOrderTraverse(T->rchild,Visit))

                  return OK;

       return ERROR;

    }

    return OK;

}

 

中序遍历二叉树

Status InOrderTraverse(BiTree T,Status(*Visit)(TElemType e))    //中序遍历二叉树。

{

   if(T)

    {

       if(PreOrderTraverse(T->lchild,Visit))

           if(Visit(T->data))

              if(PreOrderTraverse(T->rchild,Visit))

                  return OK;

       return ERROR;

    }

    return OK;

}

 

 

后续遍历二叉树

Status PostOrderTraverse(BiTree T,Status(*Visit)(TElemType e))   //后续遍历二叉树

{

   if(T)

    {

       if(PreOrderTraverse(T->lchild,Visit))

           if(PreOrderTraverse(T->rchild,Visit))

              if(Visit(T->data))

                  return OK;

       return ERROR;

    }

    return OK;

}

 

层次遍历二叉树

Status LevelOrderTraverse(BiTreeT,Status (*Visit)(TElemType e))  //层次遍历二叉树

{

   BiTree a[MAX];

    int i,j;  //i尾 j为头

    i=j=0;

    BiTreep=T;

    if(p!=NULL)

    {

       a[i]=p;

       while(j<=i&&a[j]!=NULL)

       {

           p=a[j];

           i++;

           Visit(p->data);

           if(p->lchild!=NULL)

           {

              a[i]=p->lchild;

              i++;

           }

           if(p->rchild!=NULL)

           {

              a[i]=p->rchild;

              i++;

           }

           j++;

       }

    }

    return OK;

}

 

Visit 函数的编写

Status Visit(TElemType e)

{

  printf("%c ",e);

  return OK;

}

深度

Status Length(BiTree T)

{

  int L1,L2;

  if(T==NULL)

       return 0;

    L1=Length(T->lchild)+1;

    L2=Length(T->rchild)+1;

 

  if(L1>L2)

       return L1;

  else

       return L2;

 

}

 

结点数

Status CountNode(BiTree T)

{

    int sum;

    if(T==NULL)

       return 1;

    else

    {

      sum=CountNode(T->lchild);

      sum=CountNode(T->rchild);

      return sum+1;

    }

}

 

原创粉丝点击