C语言-二叉树

这篇博客介绍了如何使用C语言构建和遍历二叉树。它提供了创建二叉树的函数以及实现前序、中序、后序和层次遍历的函数。此外,还包含了计算二叉树深度和查找叶子节点数量的功能。
摘要由CSDN通过智能技术生成
#include "string.h"
#include "stdio.h"   
#include "stdlib.h"  
//#include "io.h" 
#include "math.h" 
#include "time.h"
#define maxsize 7
typedef int Status;  /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
/* 用于构造二叉树********************************** */
int zb=1;
typedef char String[24]; /*  0号单元存放串的长度 */
String str;
typedef char TElemType;
TElemType Nil=' '; /* 字符型以空格符为空 */
typedef struct BiTNode  /* 结点结构 */
{
   TElemType data;  /* 结点数据 */
   struct BiTNode *lchild,*rchild; /* 左右孩子指针 */
}BiTNode,*BiTree;
void CreateBiTree(BiTree *T)
{
 TElemType ch;
 printf("请输入一个字符:\n");
 scanf("%c",&ch);
 getchar();
 if(ch=='#')
  *T=NULL;
 else
 {
  *T=(BiTree)malloc(sizeof(BiTNode));
  if(!*T)
   exit(OVERFLOW);
  (*T)->data=ch; /* 生成根结点 */
  CreateBiTree(&(*T)->lchild); /* 递归构造左子树 */
  CreateBiTree(&(*T)->rchild); /* 递归构造右子树 */
 }
 }
int main()
{
 BiTree T;
 printf("请创建一个二叉树\n");CreateBiTree(&T);
 printf("选择您的操作:1:前序遍历二叉树,2:中序遍历二叉树,3:后序遍历二叉树,4:层次遍历二叉树,5:二叉树的深度,6:遍历所有叶子结点,7:遍历所有叶子结点并输出,8:退出\n");
 int KEY;
 while(1)
 { 
  printf(">>输入您的选择:");
      scanf("%d",&KEY);
  switch(KEY)
  {
   case 1:printf("********************************************\n");
     printf("前序遍历二叉树:");PreOrderTraverse(T);
     printf("\n********************************************\n");break;
   case 2:printf("********************************************\n");
     printf("中序遍历二叉树:");InOrderTraverse(T);
     printf("\n********************************************\n");break;
   case 3:printf("********************************************\n");
     printf("后序遍历二叉树:");PostOrderTraverse(T);
     printf("\n********************************************\n");break;
   case 4:printf("********************************************\n");
     printf("层次遍历二叉树:");LevelOrderTraverse(T);
     printf("\n********************************************\n");break;
   case 5:printf("********************************************\n");
     printf("二叉树的深度:%d",BiTreeDepth(T));
     printf("\n********************************************\n");break;
   case 6:printf("********************************************\n");
     printf("遍历所有叶子结点个数:%d",CountLeaf(T));
     printf("\n********************************************\n");break;
   case 7:printf("********************************************\n");
     printf("遍历所有叶子结点并输出:");Leaf(T);
     printf("\n********************************************\n");break;
   case 8:exit(1);break;
   default:printf("无效选项!\n**********************************");break;
  }
 }
}
int PreOrderTraverse(BiTree T)//先序遍历
{
 if(T==0)
  return;//递归退出条件
 printf("%c",T->data);//显示结点数据,并更改为其他对结点操作
 PreOrderTraverse(T->lchild);//再先序遍历左子树
 PreOrderTraverse(T->rchild);//最后先序遍历右子树
}
int InOrderTraverse(BiTree T)//中序遍历
{
 if(T==0)
  return;
 InOrderTraverse(T->lchild);//先遍历左子树
 printf("%c",T->data);//再遍历根结点
 InOrderTraverse(T->rchild);//最后遍历右子树
}
int PostOrderTraverse(BiTree T)//后序遍历
{
 if(T==0)
  return;
 PostOrderTraverse(T->lchild);//先遍历左子树
 PostOrderTraverse(T->rchild);//后遍历右子树
 printf("%c",T->data);//最后遍历根结点
}
int BiTreeDepth(BiTree T)//求二叉树深度,见笔记,利用递归完成
{
 int i,j;
 if(!T)
  return 0;
 if(T->lchild)
  i=BiTreeDepth(T->lchild);
 else
  i=0;
 if(T->rchild)
  j=BiTreeDepth(T->rchild);
 else
  j=0;
 return i>j?i+1:j+1;
}

int LevelOrderTraverse(BiTree T)//层次遍历
{
    BiTree Queue[maxsize];//数组指针
    int Front,Rear;
    if(T==NULL)
        return 0;
    Front=-1;
    Rear=0;
    Queue[Rear]=T;
    while(Front!=Rear)
    {
        Front++;
        printf("%c",Queue[Front]->data);//访问队头结点的数据域
        if(Queue[Front]->lchild!=NULL)//将队头结点的左孩子结点入队
        {
            Rear++;
            Queue[Rear]=Queue[Front]->lchild;
        }
        if(Queue[Front]->rchild!=NULL)//将队头结点的右孩子结点入队
        {
            Rear++;
            Queue[Rear]=Queue[Front]->rchild;
        }
    }
}
 
int CountLeaf(BiTree T)//求所有叶子结点个数
{
 int m,n;
 if(T==NULL) return 0;
 if(T->lchild==NULL&&T->rchild==NULL) return 1;
 else
  {
   m=CountLeaf(T->lchild);
   n=CountLeaf(T->rchild);
   return m+n;
  }
}
  
int Leaf(BiTree T)//求所有叶子结点
{
      if(T!=NULL)
         {
         if(T->lchild==NULL&&T->rchild==NULL)
            printf("%c",T->data);
        Leaf(T->lchild);
        Leaf(T->rchild);  
    }
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值