二叉树顺序存储的递归相关操作

//author:      cqm                  
 //date:        2004-9-4
 //description: 二叉树的递归操作
 #include <stdio.h>
 #include <stdlib.h>
 #include <malloc.h>
 typedef char DataType;
 typedef struct node
 {
 DataType data;
 struct   node *lchild,*rchild;
 }BiTNode;
 typedef BiTNode * BiTree;
 
 //建立二叉树
 void CreateBiTree(BiTree * T)
 {
 char c;
 printf("进入 CreateBiTree...\n");
 scanf("%c",&c);
 getchar();
 if(c == ' ')
 {
  printf("不产生子树。\n");
  *T = NULL;
 }
 else
 {
  *T = (BiTNode *)malloc(sizeof(BiTNode));             //生成一个新节点
  (*T)->data = c;
  printf("产生左右子树。\n");
  CreateBiTree(&(*T)->lchild);                            //生成左子树
  CreateBiTree(&(*T)->rchild);                            //生成右子树
 }
 }

 //前序遍历
 void Preorder(BiTNode * T)
 {
  if(T)
  {
  printf("%c\n",T->data);
  Preorder(T->lchild);                                //遍历左子树
  Preorder(T->rchild);                                //遍历右子树
  }
 }

 //中序遍历
 void Inorder(BiTNode * T)
 {
  if(T)
  {
  Inorder(T->lchild);
  printf("%c\n",T->data);
  Inorder(T->rchild);
  } 
 }
 
 //后序遍历
 void Postorder(BiTNode * T)
 {
  if(T)
  {
   Postorder(T->lchild);
   Postorder(T->rchild);
   printf("%c\n",T->data);
  } 
 }

 void main()
 {
 BiTree T = NULL;
 char j;
 int flag = 1;

 //-------------程序解说---------------
 printf("本程序实现二叉树的操作。\n");
 printf("可以进行建立二叉树,递归先序、中序、后序遍历。\n");
 printf("请将先序遍历二叉树的结果输入已建立二叉树。\n");
 printf("对于叶子节点以空格表示。\n");
 printf("例如:abc de g f (回车) 如下二叉树:\n");
 printf("           a       \n");
 printf("          /        \n");
 printf("         b         \n");
 printf("        / \\       \n");
 printf("       c   d       \n");
 printf("          / \\     \n");
 printf("         e   f     \n");
 printf("          \\       \n");
 printf("           g       \n");

 CreateBiTree(&T);                             //初始化树
 while(flag)
    {
   printf("请选择: \n");
      printf("1.递归先序遍历\n");
      printf("2.递归中序遍历\n");
      printf("3.递归后序遍历\n");
      printf("4.退出程序\n");
      scanf("%c",&j);
   getchar();
      switch(j)
   {
   case '1':
     if(T)
     {
      printf("先序遍历二叉树:");
      Preorder(T);
      printf("\n");
     }
     else printf("二叉树为空!\n");
     break;
   case '2':
     if(T)
    {
     printf("中序遍历二叉树:");
     Inorder(T);
     printf("\n");
    }
     else printf("二叉树为空!\n");
     break;
      case '3':
     if(T)
    {
     printf("后序遍历二叉树:");
     Postorder(T);
     printf("\n");
    }
     else printf("二叉树为空!\n");
     break;
  default:
   flag=0;printf("程序运行结束,按任意键退出!\n");
   }
    }
 }

转载于:https://www.cnblogs.com/cqm/archive/2004/09/17/43962.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值