二叉树的实现和遍历

#include <stdio.h>
#include <malloc.h>
//定义二叉树
typedef struct bitnode
{
    int data;
    struct bitnode *lchild,*rchild;
}bitnode,*bitree;
//创建二叉树利用先序创建
void createbitree(bitree *T)
{
    int dat;
    printf("请输入节点数据:");
    scanf("%d",&dat);
    if(dat==0) (*T) = NULL;
    else
    {
        (*T) = (bitree)malloc(sizeof(bitnode));
        (*T)->data=dat;     
        createbitree(&((*T)->lchild));     
        createbitree(&((*T)->rchild));
    }
}
//二叉树的先序遍历递归算法
void postorder10(bitree T)
{
    if (T != NULL)
    {
       printf("%d/t",T->data);
       postorder10(T->lchild);
       postorder10(T->rchild);

     }

}

//二叉树的中序遍历递归算法
void postorder20(bitree T)
{
    if (T != NULL)
    {
      postorder20(T->lchild);
       printf("%d/t",T->data);
       postorder20(T->rchild);
    }

}

//二叉树的中序遍历非递归算法
void postorder21(bitree t)
   {
    bitree s[100];
     int top=0;
     while (t!=NULL || top!=0)
      {
         while (t!=NULL)
         {
             s[++top]=t;   t=t->lchild ;
         }
           if (top!=0)
           {
            t=s[top--];  printf("%d/t",t->data);  t=t->rchild;
           }
      }
   }
//二叉树的后序遍历递归算法
void postorder30(bitree T)
{
    if (T != NULL)
    {
       postorder30(T->lchild);
       postorder30(T->rchild);
       printf("%d/t",T->data);
    }

}

//在二叉树t中查找值为x的结点
void locate(bitree t, int x)
 {
   bitree p;
   p=t;
   if (t == NULL)
    printf("0/n");
   else if( t->data == x)
     printf("%d/n",p->data);
   else
   {
      p=t->lchild;
      if (p)
        locate(t->lchild, x);
      else
       locate(t->rchild, x);
   }
}
//以二叉链表作存储结构,试编写求二叉树深度的算法
int BinTreeDetth(bitree T)
{
    int l,r;
    if(T==NULL)return 0;
   else
   {
       l=BinTreeDetth(T->lchild);
           r=BinTreeDetth(T->rchild);
           return((l>r?l:r)+1);
   }
}
//以二叉链表作为存储结构,试编写求二叉树中叶子数的算法
int LeafCount1(bitree T)  
{
    int i,j;
   if(!T) return 0;                     //空树没有叶子
  else if(T->lchild==NULL&&T->rchild==NULL)
  {
      return 1; //叶子结点
  }
 
  else
  {
      i=LeafCount1(T->lchild);
      j=LeafCount1(T->rchild);
          return (i+j);
  }
   //左子树叶子数加上右子树叶子数
}

void main()
{
   bitree T;int n,m;
   createbitree(&T);
   printf("Create Success!/n/n");
  while(1)
  {
    printf("请输入你要执行的操作:/n");
    printf("0------------------------结束此次操作/n");
    printf("1----------------------------先序遍历/n");
    printf("2----------------------------中序遍历/n");
    printf("3----------------------------后序遍历/n");
    printf("4----------------------查找你要的结点/n");
    printf("5---------------求此二叉排序树的深度/n");
    printf("6---------求此二叉排序树的叶子结点数/n");
    scanf("%d",&n);
    switch(n)
    {
     case 0:
           return;      
     case 1:
           printf("先序遍历为:/n");
           postorder10(T);
           printf("/n");
           break;
     case 2:
           printf("中序遍历为:/n"); 
          printf("递归:/n");
           postorder20(T);
           printf("/n");
           printf("非递归:/n");
           postorder21(T);
           printf("/n");
           break;
     case 3:
           printf("后序遍历为:/n"); 
           postorder30(T);
           printf("/n");
           break;
     case 4:
           printf("请输入你要查找的结点:/n");
           scanf("%d",&m);
           printf("你要查找的结点为: /n");
           locate(T,m);
           break;
     case 5:
           printf("树的深度为:/n");
           printf("%d/n",BinTreeDetth(T));
           break;
     case 6:
           printf("此树的叶子结点数为:/n");
           printf("%d/n",LeafCount1(T));
           break;
    }
  }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值