数据结构学习——二叉树遍历

  1 #include"stdio.h"
  2 #include"stdlib.h"
  3 #define maxsize 100
  4 //二叉树链表类型定义 
  5 typedef struct node{
  6     char data;
  7     struct node *lchild;//左指针 
  8     struct node *rchild;//右指针 
  9 }BTreeNode;
 10 //二叉树创建 
 11 BTreeNode *create(){
 12     BTreeNode *s;
 13     BTreeNode *q[maxsize];//设置数组,存放每个结点的地址值
 14     int i,j;
 15     char x;
 16     printf("***开始创建***\n");
 17     printf("i,x=");
 18     scanf("%d,%c",&i,&x);
 19     if(i==0)//如果二叉树为空 
 20     {
 21         q[1]=NULL;
 22     }
 23     while(i!=0&&x!='s')//当i=0,x='s',结束结点创建
 24     {
 25         s=(BTreeNode*)malloc(sizeof(BTreeNode));//申请内存
 26         s->data=x;
 27         s->lchild=NULL;
 28         s->rchild=NULL;
 29         q[i]=s; 
 30         if(i!=1)//非根节点,寻找双亲结点的地址
 31         {
 32             j=i/2;//j为双亲结点的地址 
 33             if(i%2==0)//左孩子
 34             {
 35                 q[j]->lchild=s; 
 36             } else{//右孩子 
 37                 q[j]->rchild=s;
 38             }
 39         } 
 40         printf("i,x=");
 41         scanf("%d,%c",&i,&x);
 42         } 
 43          
 44  
 45     return q[1];//返回根结点
 46 } 
 47 
 48 //二叉树遍历
 49 //1、先序遍历
 50 void preOrder(BTreeNode *Tree){
 51     if(Tree){
 52         printf("%c",Tree->data);//输出根结点 
 53         preOrder(Tree->lchild);//左结点输出 
 54         preOrder(Tree->rchild);//右结点输出 
 55     } 
 56     
 57 } 
 58 //中序遍历
 59  void inOrder(BTreeNode *Tree){
 60     if(Tree){
 61         inOrder(Tree->lchild);//左结点输出 
 62         printf("%c",Tree->data);//输出根结点 
 63         inOrder(Tree->rchild);//右结点输出 
 64     } 
 65     
 66 } 
 67 //后序遍历
 68  void postOrder(BTreeNode *Tree){
 69     if(Tree){
 70         postOrder(Tree->lchild);//左结点输出
 71         postOrder(Tree->rchild);//右结点输出
 72          
 73         printf("%c",Tree->data);//输出根结点 
 74          
 75     } 
 76     
 77 } 
 78 //层次遍历
 79 void levelOrder(BTreeNode *Tree){
 80     BTreeNode *p,*q[maxsize];
 81     int rear=0,front=0;
 82     if(Tree){
 83         p=Tree;
 84         q[rear]=p;//根结点入队 
 85         rear=(rear+1)%maxsize;//尾指针后移
 86         while(front!=rear)//当队列不为空
 87         {
 88             p=q[front];//取队头元素 
 89             printf("%c",p->data);
 90             front=(front+1 )%maxsize;//头指针后移 
 91             if(p->lchild){//如果左孩子不为空,左孩子入队 
 92                 q[rear]=p->lchild;
 93                 rear=(rear+1)%maxsize;
 94             }
 95             if(p->rchild){//如果右孩子不为空,右孩子入队 
 96                 q[rear]=p->rchild;
 97                 rear=(rear+1)%maxsize;
 98             }
 99         }    
100     } 
101     
102 } 
103  int main(){
104      BTreeNode *Tree=create();//创建二叉树
105      printf("先序遍历:\n");
106      preOrder(Tree);
107      printf("\n中序遍历:\n");
108      inOrder(Tree);
109      printf("\n后序遍历:\n");
110      postOrder(Tree);
111      printf("\n层次遍历:\n");
112      levelOrder(Tree);
113       
114  }

猜你喜欢

转载自www.cnblogs.com/Rong-Xiu/p/10051530.html
今日推荐