关闭

二叉树的先序 中序 后序 层次遍历 求叶节点个数、深度、最大元、最小元

标签: 数据结构
508人阅读 评论(0) 收藏 举报
分类:
在做数据结构试验的时候遇到了二叉树问题,现将二叉树的常用操作分享出来。
#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;
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:4312次
    • 积分:79
    • 等级:
    • 排名:千里之外
    • 原创:4篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档