层次遍历方法建树,用队。实现树与孩子兄弟二叉链表的转化!

//第一部分头文件及相关存储结构(Head.h)

#include<stdio.h>

#include<string.h>

#include<malloc.h>

#include<stdlib.h>

typedef int Status;

typedef int ElemType;

 

typedef struct CSNode
{
      ElemType data ;
     
   struct CSNode *firstchild, *nextsibling;

} CSNode,*CSTree;

typedef CSTree QElemType;

typedef struct QNode
{
 QElemType data;
    
 struct QNode *next;

} QNode,*QueuePtr;

 

typedef struct
{
  QueuePtr front;

  QueuePtr rear;

}LinkQueue;

 

 

 

//第二部分:队的简单操作(Queue.c)


 

#include"Head.h"

Status InitQueue(LinkQueue *Q)
{
 Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));//指向头结点
 if(!Q->front) exit(0);
 Q->front->next=NULL;
 return 1;
}

Status EnQueue (LinkQueue *Q,QElemType e)
{
  QueuePtr p;
  p=(QueuePtr)malloc(sizeof(QNode));
  p->data=e;
  p->next=NULL;
  Q->rear->next=p;
  Q->rear=p;
  return 1;
}

Status DeQueue (LinkQueue *Q)
{
  QueuePtr p;
  if(Q->front==Q->rear) return 0;
  p=Q->front->next;
  Q->front->next=p->next;
  if(Q->rear==p) Q->rear=Q->front;
  free(p);
  return 1;
}

QElemType GetHead(LinkQueue *Q)
{
 if(Q->front==Q->rear) return 0;
 
 return Q->front->next->data;
}

Status DestroyQueue(LinkQueue *Q)
{
  while(Q->front)
  {
    Q->rear=Q->front->next;
    free(Q->front);
    Q->front=Q->rear;
  }

  return 1;
}

第三部分:层次建树实现树与二叉树的转化

#include"Queue.c"
//层次遍历建立一棵树(孩子兄弟二叉链表)
CSTree CreateTree()
{
  CSTree T,p,r;
  int fa,ch;
  LinkQueue Q;
  int n;
  printf("请输入创建树的结点的个数\n");
  scanf("%d",&n);
  if(n==0) T=NULL;
  else
  {
 InitQueue(&Q);
    T=(CSTree)malloc(sizeof(CSNode));
    printf("请输入根结点的数据\n");
    scanf("%d",&T->data);
    T->firstchild=T->nextsibling=NULL;
    EnQueue (&Q,T);
    for(;n>1;n--)
 {
     printf("请输入当前结点的父亲数据和自己数据\n");
        scanf("%d %d",&fa,&ch);
        CSTree s=(CSTree)malloc(sizeof(CSNode));
      s->data=ch;s->firstchild=s->nextsibling=NULL;
     p=GetHead(&Q);
     while(p->data!=fa)
  {
      DeQueue (&Q);
      p=GetHead(&Q);
  }
     if(!p->firstchild)
  {
      p->firstchild=s;
      r=s;
  }
      else
  {
        r->nextsibling=s;
       r=s;
  }
      EnQueue (&Q,s);
 }
  }
  DestroyQueue(&Q);
  return T;
}

//树的遍历即孩子兄弟链表的遍历不多赘述
//树的先序遍历即孩子兄弟链表线序遍历
void PreOrderTraverse(CSTree T)
{
 
 if(T)
 {
  printf("%d ",T->data);
 
  PreOrderTraverse(T->firstchild);
 
  PreOrderTraverse(T->nextsibling);
 }

}
//树的后序遍历即孩子兄弟链表中序遍历
void InOrderTraverse(CSTree T)
{
 
 if(T)
 {
  InOrderTraverse(T->firstchild);

  printf("%d ",T->data);

  InOrderTraverse(T->nextsibling);
 }


}

 


void main()
{
  CSTree T;
  T=CreateTree();
  PreOrderTraverse(T);
  printf("\n");
  InOrderTraverse(T);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值