建立任意二叉树的二叉链表存储,并对其进行先序、中序、后序遍历。

论坛 期权论坛 期权     
自断义   2018-4-28 02:21   9216   4
C语言。。。采用二叉链表作为存储结构,以加入虚结点的先序序列输入该二叉树,并设置选单,依据选单项分别输出该二叉树的先序、中序、后序序列。二叉树子结点的数据域可采用字符类型。

分享到 :
0 人收藏

4 个回复

正序浏览
5#
热心网友  15级至尊 | 2018-4-30 01:12:52
建立任意二叉树的二叉链表存储,并对其进行先序、中序、后序遍历。
财源滚滚随春到 喜气洋洋伴福来 横批:财源广进 淘你喜欢,淘你所爱,快购吧
4#
热心网友  15级至尊 | 2018-4-30 01:12:51
#include "stdio.h"
#include "malloc.h"
#define ELEMTYPE char
typedef struct BiTNode
{ ELEMTYPE data;
  struct BiTNode *lchild,*rchild;
} BiTNode;
BiTNode *bulid()         /*建树*/
{ BiTNode *q;
  BiTNode *s[20];
int i,j;
char x;
printf("请按顺序输入二叉树的结点以输入0和*号结束\n");
printf("请输入你要输入的为第几个结点i=\n");
scanf("%d",&i);
printf("请输入你要输入该结点的数为x=");
getchar();
scanf("%c",&x);
while(i!=0&&x!='*')
{q=(BiTNode*)malloc(sizeof(BiTNode));
   q->data=x;
   q->rchild=NULL;
   q->lchild=NULL;
   s=q;

   if(i!=1)
   { j=i/2;
       if(i%2==0)
     s[j]->lchild=q;
    else
     s[j]->rchild=q;
   }

   printf("请输入你要输入的为第几个结点x=\n");
   scanf("%d",&i);
   printf("请输入你要输入该结点的数x=");
   getchar();
   scanf("%c",&x);
}
return s[1];
}
void preoder(BiTNode *bt)  /*先序遍历*/
{ if(bt!=NULL)
{
  printf("%c\n",(bt->data));

  preoder(bt->lchild);

  preoder(bt->rchild);
}
}
void InOrder(BiTNode *bt)   /*中序遍历*/
{ if(bt!=NULL)
{  InOrder(bt->lchild);
   printf("%c\n",bt->data);
   InOrder(bt->rchild);
}
}
void postOrder(BiTNode *bt)  /*后序遍历*/
{ if(bt!=NULL)
{ postOrder(bt->lchild);
  postOrder(bt->rchild);
  printf("%c\n",bt->data);
}
}

main()
{ int a;
  BiTNode *bt;
  bt=bulid();
k1: printf("需要先序遍历输出请输入1,中序遍历请输入2,后序遍历请输入3,结束输入0:");
  scanf("%d",&a);
  switch(a)
  {
  case(1): preoder(bt);  goto k1;
  case(2): InOrder(bt);  goto k1;
  case(3): postOrder(bt); goto k1;
  case(0): break;
    }
}

3
另外,虚机团上产品团购,超级便宜
3#
huqifu_1990  1级新秀 | 2018-4-30 01:12:50
二叉树的定义是递归的。用递归就可以实现了。
建立二叉树,前,中,后遍历:
bitree_node* creat_bitree(bitree_node *r)
{
  ch=getchar();
  if(ch=='#') return NULL;
  else
  {
   r=new bitree_node;
   r->data=ch;
   r->lchild=creat_bitree(r->lchild);
   r->rchild=creat_bitree(r->rchild);
  }
  return r;
}
void preorder(bitree_node *r)
{
  bitree_node* p=r;
  if(p==NULL) return;
  else
  {
   coutlchild);
   preorder(p->rchild);
  }

}
void inorder(bitree_node *r)
{
  bitree_node* p=r;
  if(p==NULL) return;
  else
  {
   inorder(p->lchild);
   coutrchild);
  }
}
void postorder(bitree_node *r)
{
  bitree_node* p=r;
  if(p==NULL) return;
  else
  {
   postorder(p->lchild);
   postorder(p->rchild);
   cout
2#
IT1006黄龙超  3级会员 | 2018-4-30 01:12:49
#include "stdio.h"
#include "stdlib.h"
#define STACK_INIT_SIZE  10     //栈的初始长度
#define STACKINCREMENT  5      //栈的追加长度

typedef  struct bitree{
      char data;
      struct bitree *lchild,*rchild;
      }bitree;           //二叉树结点定义

typedef  struct {
      bitree **base;
      bitree **top;
      int stacksize;
      }sqstack;       // 链栈结点定义top栈顶  base栈底  且栈元素是指向二叉树结点的二级指针
//建立一个空栈
int initstack(sqstack *s)
{s->base=(bitree *)malloc(STACK_INIT_SIZE*sizeof(bitree)); //栈底指向开辟空间
if(!s->base) exit(1);                  //抛出异常
s->top=s->base;                      //栈顶=栈尾  表示栈空
s->stacksize=STACK_INIT_SIZE;           //栈长度为开辟空间大小
return 1;
}
//进栈
int push(sqstack *s,bitree *e)
{if(s->top-s->base>=s->stacksize)   //如果栈满  追加开辟空间
   {s->base=(bitree *)realloc (s->base,(s->stacksize+STACKINCREMENT)* sizeof(bitree));
    if(!s->base) exit(1);     //抛出异常
s->top=s->base+s->stacksize;     //感觉这一句没用
s->stacksize+=STACKINCREMENT;}
*(s->top)=e;s->top++;        //进栈  栈顶后移
return 1;
}
//出栈
int pop(sqstack *s,bitree **e)
{if(s->top==s->base) return 0;       //栈空  返回0
--s->top;*e=*(s->top);      //栈顶前移  取出栈顶元素给e
return 1;}
//取栈顶
int gettop(sqstack *s,bitree **e)            //去栈顶元素  注意top指向的是栈顶的后一个
{if(s->top==s->base) return 0;              //所以  s->top-1
*e=*(s->top-1);
return 1;
}
/*------------------------非递归-----先序建立二叉树----------------------------------*/
bitree *createprebitree()
{char ch;bitree *ht,*p,*q;
sqstack *s;
s=malloc(sizeof(bitree));      //加上这一句为s 初始化开辟空间
ch=getchar();
if(ch!='#'&&ch!='\n')      /*      输入二叉树先序顺序  是以完全二叉树的先序顺序
  不是完全二叉树的把没有的结点以#表示    */
  {ht=(bitree *)malloc(sizeof(bitree));
   ht->data=ch;
   ht->lchild=ht->rchild=NULL;
   p=ht;
   initstack(s);
   push(s,ht);       //根节点进栈
   while((ch=getchar())!='\n')                                 //  算
    {if(ch!='#') {q=(bitree *)malloc(sizeof(bitree));          //  法
                  q->data=ch;                                  //
                  if(p==*(s->top-1)) p->lchild=q;              //  核
                  else p->rchild=q;                            //
                  push(s,q);p=q;                               //  心
   }                                                           //
     else {if(p==*(s->top-1)) p->lchild=NULL;                  //  的
           else p->rchild=NULL;                                //
           pop(s,&p);}                                         //  步
                                                               //
}                                                          //  骤
    return ht;
   }
else return NULL;
}
/*--------------------------递归---------先序建立二叉树-------------------------------*/
void  CreateBiTree(bitree **T) {
//按先序次序输入二叉树中的结点的值(一个字符),空格字符表示空树,
//构造二叉链表表示二叉树
char ch;
scanf("%c",&ch);
if(ch=='#') *T=NULL;
else{
  *T=(bitree * )malloc(sizeof(bitree));
  if(!*T) exit(1);
  (*T)->data=ch;       //生成根结点
  CreateBiTree(&(*T)->lchild);     //构造左子树
  CreateBiTree(&(*T)->rchild);     //构造右子树
}
}
/*--------------------------非递归-------中序建立二叉树-------------------------------*/
/*--------------------------递归---------中序建立二叉树-------------------------------*/
/*--------------------------非递归-------后序建立二叉树-------------------------------*/
/*--------------------------递归---------后序建立二叉树-------------------------------*/

/*-----------------------非递归------先序输出二叉树------------------------------*/
void preordertraverse(bitree *h)
{sqstack m;
initstack(&m);
while(h||m.base!=m.top)
{if(h)  {push(&m,h);printf("%c",h->data);h=h->lchild;}
else{pop(&m,&h);
h=h->rchild;}
}
}
/*------------------------非递归-----中序输出二叉树----------------------------*/
void inordertraverse(bitree *h)
{sqstack m;
initstack(&m);
while(h||m.base!=m.top)
{if(h) {push(&m,h);h=h->lchild;}
else {
pop(&m,&h);
printf("%c",h->data);
h=h->rchild;
}
}
}
/*---------------------非递归----后序遍历二叉树----------------------------------*/
void postordertraverse(bitree *h)
{
sqstack m;
initstack(&m);
while(h||m.base!=m.top)
{if(h) {
  push(&m,h);
  h=h->lchild;}
else {
  bitree *r;         //使用r结点表示访问了右子树 代替标志域
  gettop(&m,&h);
  if(h->rchild&&h->rchild!=r)
  {h=h->rchild;
  push(&m,h);
  h=h->lchild;}
  else{pop(&m,&h);
  printf("%c",h->data);
  r=h;h=NULL;}
  }
}
}
//层次遍历二叉树   用队列  哈哈以后做
/*-------------------------------主过程-------------------------------*/
int main()
{bitree *ht;
printf("先序非递归建立一个二叉树:");
if((ht=createprebitree())!=NULL)  //非递归建立
//CreateBiTree(&ht);
//if(ht!=NULL)        //递归建立
{
  printf("先序遍历输出二叉树:");
             preordertraverse(ht);
    putchar('\n');
  printf("中序遍历输出二叉树:");
             inordertraverse(ht);
    putchar('\n');
  printf("后序遍历输出二叉树:");
            postordertraverse(ht);
   putchar('\n');
}
else printf("空二叉树\n");
}
这是先序递归和非递归建立二叉树   和 先、中、后 的遍历输出
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:
帖子:
精华:
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP