数据结构二叉树操作

#include <stdio.h>
#include <stdlib.h>
typedef struct BNode
{
    int data;
    struct BNode *lchild,*rchild;
}BiTNode,*BiTree;


void CreatTree(BiTree *T);                   //创建一个二叉树
void welcome();                              //欢迎界面
void PreOrderTraverse(BiTree T);             //前序遍历
void InOrderTraverse(BiTree T);              //中序遍历
void PostOrderTraverse(BiTree T);            //后序遍历
void LevelTraverse(BiTNode *b);              //层次遍历
int LeaveNode(BiTree T);                    //求叶子节点个数
int AllNode(BiTree T);                       //求所有节点个数
int TreeDeep(BiTree T);                         //求二叉树的深度
int GetMax(BiTree T);                     //最大元
int GetMin(BiTree T);                       //最小元


void main()
{
    BiTree T;
    printf("创建二叉树\n");
    CreatTree(&T);
    printf("前序遍历:\n");
    PreOrderTraverse(T);
    printf("\n");
    printf("中序遍历:\n");
    InOrderTraverse(T);
    printf("\n");
    printf("后序遍历:\n");
    PostOrderTraverse(T);
    printf("\n");
    printf("层次遍历:\n");
    LevelTraverse(T);
    printf("\n");
    printf("叶子节点数=%d\n",LeaveNode(T));
    printf("总节点数=%d\n",AllNode(T));
    printf("该树的深度=%d\n",TreeDeep(T));
    printf("最大元=%d",GetMax(T));
    printf("\n");
    printf("最小元=%d",GetMin(T));
    printf("\n");
}


void welcome()
{


    printf("1.创建二叉树\n");
    printf("2.前序遍历\n");
    printf("3.中序遍历\n");
    printf("4.后序遍历\n");
    printf("5.层次遍历\n");
    printf("6.叶节点和所有节点个数、深度\n");
    printf("0.退出\n");
}


void CreatTree(BiTree *T)
{


    int num;
    printf("Please input a data:");
    scanf(" %d",&num);


    if(num==-1){   //-1表示子节点为空
        *T = NULL;
    }else{
        (*T) = (BiTree)malloc(sizeof(BiTNode));
        if(!*T){
            printf("Error! No enough memory!");
            exit(0);
        }
        (*T)->data = num;
        CreatTree(&(*T)->lchild);
        CreatTree(&(*T)->rchild);
    }
}


void PreOrderTraverse(BiTree T)          //前序遍历
{
    if(T!=NULL)
    {
        printf(" %d",T->data);
        PreOrderTraverse(T->lchild);
        PreOrderTraverse(T->rchild);
    }


}


void InOrderTraverse(BiTree T)
{
    if(T!=NULL){
        InOrderTraverse(T->lchild);
        printf(" %d",T->data);
        InOrderTraverse(T->rchild);
    }
}


void PostOrderTraverse(BiTree T)
{
    if(T!=NULL)
    {
        PostOrderTraverse(T->lchild);
        PostOrderTraverse(T->rchild);
        printf(" %d",T->data);
    }
}


//采用栈结构来实现层次遍历
void LevelTraverse(BiTree T){
    int flag=0;   //控制打印的换行问题
    BiTree p;
    BiTree qu[40];
    int front,rear;
    front =rear=-1;
    rear++;
    qu[rear]=T;
    while(front !=rear)
    {
       front++;
       p=qu[front];
       printf("%d ",p->data);
       if(p->lchild)
       {
           printf("\n");
           flag=0;
           rear++;
           qu[rear]=p->lchild;
       }
       if(p->rchild)
       {
           if(flag==1)
               printf("\n");
           rear++;
           qu[rear]=p->rchild;
           flag=1;
       }
    }
}


/*
    求叶节点个数
*/
int LeaveNode(BiTree T){
    static int num=0;
    if(T)
    {
    if(T->lchild ==NULL &&T->rchild==NULL)
        num++;
        LeaveNode(T->lchild);
        LeaveNode(T->rchild);
    }
  return num;
}


/*
    求树的深度
*/
int TreeDeep(BiTree T)
{
  int deep = 0;
  if(T)
  {
    int leftdeep = TreeDeep(T->lchild);
    int rightdeep = TreeDeep(T->rchild);
    deep = leftdeep>=rightdeep?leftdeep+1:rightdeep+1;
  }
  return deep;
}


/*
    求总的节点个数
*/
int AllNode(BiTree T){
    if(T==NULL)
        return 0;
    return 1+AllNode(T->lchild)+AllNode(T->rchild);
}


int GetMax(BiTree T)
{
    static int max=0;
    if(T!=NULL){
        if(max<T->data) max=T->data;
        GetMax(T->lchild);
        GetMax(T->rchild);
    }
    return max;
}
int GetMin(BiTree T)
{
    static int min=99999999;
    if(T!=NULL){
        if(T->data<min) min=T->data;
        GetMin(T->lchild);
        GetMin(T->rchild);
    }
    return min;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值