Chinaunix首页 | 论坛 | 博客
  • 博客访问: 178358
  • 博文数量: 38
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 346
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-04 00:06
文章分类

全部博文(38)

文章存档

2016年(3)

2015年(15)

2014年(16)

2013年(4)

我的朋友

分类: LINUX

2014-05-15 10:44:40


根据二叉树的性质,实现先序,中序,后序的遍历不难,这里主要是层次遍历不好想一点。

对于层次遍历的实现,需要用到链式队列,把每一层的结点的左右指针入队列。判断其左右孩子是否存在,存在则出队列,并且打印出对节点元素的值。

层次遍历意思是指:每一层从左到右依次输出元素的值,就是显示输出第一层的所有元素值,然后是第二层的,依次类推。


点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. #define N 6

  4. //二叉树的结点类型
  5. typedef char TreeType;
  6. typedef struct Treenode
  7. {
  8.     //记录二叉树结点编号
  9.     int n;
  10.     TreeType data;
  11.     struct Treenode *lchild;
  12.     struct Treenode *rchild;
  13. }BiTree;


  14. //链表结点数据类型
  15. typedef BiTree * DataType;
  16. struct node
  17. {
  18.     DataType data;
  19.     struct node *next;
  20. };

  21. //队列头的数据类型
  22. typedef struct
  23. {
  24.     struct node *front;
  25.     struct node *rear;
  26. }LinkQueue;

  27. LinkQueue *create_empty_linkqueue()
  28. {
  29.     struct node *head = NULL;
  30.     LinkQueue *q = NULL;

  31.     //链式队列头结点
  32.     head = (struct node *)malloc(sizeof(struct node));
  33.     head->next = NULL;

  34.     //链式队列的队列头
  35.     q = (LinkQueue *)malloc(sizeof(LinkQueue));
  36.     q->rear = q->front = head;

  37.     return q;
  38. }

  39. int is_empty_linkqueue(LinkQueue *q)
  40. {
  41.     return q->rear == q->front;
  42. }

  43. int enter_linkqueue(LinkQueue *q,DataType data)
  44. {
  45.     struct node *temp = NULL;

  46.     temp = (struct node *)malloc(sizeof(struct node));
  47.     temp->data = data;

  48.     //尾插法
  49.     temp->next = NULL;
  50.     q->rear->next = temp;

  51.     //更新队列尾指针
  52.     q->rear = temp;

  53.     return 0;
  54. }

  55. DataType delete_linkqueue(LinkQueue *q)
  56. {
  57.     struct node *temp = NULL;

  58.     temp = q->front;

  59.     //更新头指针,记录新头结点位置
  60.     q->front = temp->next;

  61.     free(temp);
  62.     temp = NULL;

  63.     return q->front->data;
  64. }

  65. BiTree *alloc_node(int n)//分配空间
  66. {
  67.     BiTree *root = NULL;

  68.     root = (BiTree *)malloc(sizeof(BiTree));
  69.     root->n = n;
  70.     root->lchild = root->rchild = NULL;

  71.     printf("Input %d node data:",n);
  72.     scanf("%c", &root->data);
  73.     while(getchar() != '\n');

  74.     return root;
  75. }

  76. BiTree *create_binary_tree(int n) //递归创建二叉数,先左后右
  77. {
  78.     BiTree *root = NULL;

  79.     root = alloc_node(n);

  80.     if(n * 2 <= N)
  81.     {
  82.         root->lchild = create_binary_tree(2 * n);
  83.     }

  84.     if(n * 2 + 1 <= N )
  85.     {
  86.         root->rchild = create_binary_tree(2 * n + 1);
  87.     }

  88.     return root;
  89. }

  90. //先序遍历 根 左 右
  91. int pre_order(BiTree *root)//递归输出数据,先左后右
  92. {
  93.     if(root==NULL)
  94.     {
  95.         return -1 ;
  96.     }

  97.     printf("(%d:%c) ", root->n,root->data);

  98.     pre_order(root->lchild);
  99.     pre_order(root->rchild);

  100.     return 0;

  101. }

  102. //中序遍历 左 根 右
  103. int mid_order(BiTree *root)
  104. {
  105.     if(root==NULL)
  106.     {
  107.         return -1;
  108.     }

  109.     mid_order(root->lchild);

  110.     printf("(%d:%c) ", root->n,root->data);

  111.     mid_order(root->rchild);

  112.     return 0 ;

  113. }

  114. //后续遍历 左 右 根
  115. int post_order(BiTree *root)
  116. {
  117.     if(root==NULL)
  118.     {
  119.         return -1;
  120.     }

  121.     post_order(root->lchild);
  122.     post_order(root->rchild);

  123.     printf("(%d:%c) ", root->n,root->data);

  124.     return 0;

  125. }
  126. void level_travel(BiTree *root)
  127. {
  128.     LinkQueue *q = NULL;
  129.     BiTree *p = NULL;

  130.     q = create_empty_linkqueue();

  131.     //根结点首地址首先入队
  132.     enter_linkqueue(q,root);

  133.     //队列不为空,继续循环
  134.     while(!is_empty_linkqueue(q))
  135.     {
  136.         //二叉树结点首地址出队
  137.         p = delete_linkqueue(q);
  138.         //访问出队元素
  139.         printf("(%d:%c) ",p->n,p->data);

  140.         //判断出队元素是否有左孩子,有则入队
  141.         if(p->lchild != NULL)
  142.         {
  143.             enter_linkqueue(q,p->lchild);
  144.         }

  145.         //判断出队元素是否有右孩子,有则入队
  146.         if(p->rchild != NULL)
  147.         {
  148.             enter_linkqueue(q,p->rchild);
  149.         }
  150.     }
  151.     putchar('\n');

  152.     return ;
  153. }

  154. int main()
  155. {
  156.     BiTree *root = NULL;

  157.     root = create_binary_tree(1); //根结点编号为1

  158.     pre_order(root);
  159.     putchar('\n');

  160.     mid_order(root);
  161.     putchar('\n');

  162.     post_order(root);
  163.     putchar('\n');

  164.     level_travel(root);

  165.     return 0;
  166. }



执行结果:

阅读(1946) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~