数据结构-二叉树操作

本文介绍了二叉树的基本操作,包括创建二叉树、输出二叉树、计算二叉树的高度、输出叶子节点及计算叶子节点数目。通过示例代码展示了如何实现这些操作。
摘要由CSDN通过智能技术生成

#include<stdio.h>
#include<stdlib.h>

#define MaxSize 100
typedef char ElemType;

typedef struct node
{
 ElemType data;
 struct node * lchild;
 struct node * rchild;
}BTNode;

//创建二叉树
void CreateBTNode(BTNode * & b,ElemType * str)
{
 BTNode * St[MaxSize],* p=NULL;
 int top=-1,k,j=0;
 ElemType ch;
 b=NULL;
 ch=str[j];
 while(ch!='\0')
 {
  switch(ch)
  {
  case '(':
   top++;
   St[top]=p;
   k=1;
   break;
  case ')':
   top--;
   break;
  case ',':
   k=2;
   break;
  default:
   p=(BTNode *)malloc(sizeof(BTNode));
   p->data=ch;
   p->lchild=p->rchild=NULL;
   if(b==NULL)
   {
    b=p;
   }
   else
   {
    switch(k)
    {
    case 1:St[top]->lchild=p;
     break;
    case 2:St[top]->rchild=p;
     break;
    }
   }
  }
  j++;
  ch=str[j];
 }
}

//输出二叉树
void DisplayBTNode(BTNode * b)
{
 if(b!=NULL)
 {
  printf("%c ",b->data);
  if(b->lchild!=NULL||b->rchild!=NULL)
  {
   printf("(");
   DisplayBTNode(b->lchild);
   if(b->rchild!=NULL)
   {
    printf(",");
   }
   DisplayBTNode(b->rchild);
   printf(")");
  }
 }
}

//求二叉树的高度
int BTNodeDepth(BTNode * b)
{
 int lchild,rchild;
 if(b==NULL)
 {
  return 0;
 }
 else
 {
  lchild=BTNodeDepth(b->lchild);
  rchild=BTNodeDepth(b->rchild);
  return
   (lchild>rchild?(lchild+1):(rchild+1));
 }
}
//输出叶子节点
void DisplayLeafNode(BTNode * b)
{
 if(b!=NULL)
 {
  if(b->lchild==NULL&&b->rchild==NULL)
  {
   printf("%c ",b->data);
  }
  DisplayLeafNode(b->lchild);
  DisplayLeafNode(b->rchild);
 }
}

//叶子节点数目
int LeafCount(BTNode * b) 

 if(b!=NULL) 
 { 
  if(b->lchild==NULL&&b->rchild==NULL)
  {
  return  1;
  }
  else return LeafCount(b->lchild)+LeafCount(b->rchild);
 }
 return 0;
}


void main()
{
 BTNode *b;
 CreateBTNode(b,"A(B(D(,H),E(I,J)),C(F(K),G))");
 printf("二叉树的输出:\n");
 DisplayBTNode(b);
 printf("\n");
 printf("二叉树的高度为:\n");
 printf("%d \n",BTNodeDepth(b));
 printf("输出叶子节点:\n");
 DisplayLeafNode(b);
 printf("\n");
 printf("叶子节点的数目为:\n");
 printf("%d \n",LeafCount(b));
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值