一步一步复习数据结构和算法基础-层次建立层次遍历二叉树
2012-07-17 20:39
751 查看
#include <stdio.h> #include <stdlib.h> #include <string.h> #define maxnum 100 #define maxitem 1024 typedef struct node { char data; struct node *lchild,*rchild; }btree; typedef btree* QElemType; //队列元素 typedef struct QNode { QElemType data; struct QNode *next; }QNode,*QueuePtr; //队列 typedef struct { QueuePtr front,rear; }LinkQueue; btree *Q[maxnum]; btree *CreatTree(char str[]) { int i=0; int front=1,rear=0; btree *root,*s; root = NULL; //树根 while(str[i] != '#') //如果遇到#意味着输入结束 { s = NULL; if(str[i] != '@') //@符号代表NULL { s = (btree*)malloc(sizeof(btree)); s->data = str[i]; s->lchild = NULL; s->rchild = NULL; } rear ++; Q[rear] = s; if(rear == 1)root = s; else { if(s && Q[front]) if(rear % 2 == 0) Q[front]->lchild = s; else Q[front]->rchild = s; if(rear % 2 == 1)front++; } i++; } return root; } //初始化队列 int InitQueue(LinkQueue *Q) { (*Q).front = (*Q).rear = (QueuePtr)malloc(sizeof(QNode)); if(!(*Q).front)exit(1); (*Q).front->next = NULL; return 1; } //判断队列是否为空 int QueueEmpty(LinkQueue Q) { if(Q.front == Q.rear)return 1; else return 0; } //进入队列 int EnQueue(LinkQueue *Q,QElemType e) { QueuePtr p = (QueuePtr)malloc(sizeof(QNode)); if(!p)exit(1); p->data = e; p->next = NULL; (*Q).rear->next = p; (*Q).rear = p; return 1; } //出队列 int DeQueue(LinkQueue *Q,QElemType *e) { QueuePtr p; if((*Q).front == (*Q).rear)return 0; p = (*Q).front->next; *e = p->data; (*Q).front->next = p->next; if((*Q).rear == p) (*Q).rear = (*Q).front; free(p); return 1; } //层次遍历二叉树 void LevelOrderTree(btree *root) { LinkQueue q; QElemType a; if(root) { InitQueue(&q); EnQueue(&q,root); while(!QueueEmpty(q)) { DeQueue(&q,&a); printf("%c ",a->data); if(a->lchild != NULL) EnQueue(&q,a->lchild); if(a->rchild != NULL) EnQueue(&q,a->rchild); } printf("\n"); } } //销毁树 void DestroyTree(btree *root) { if(root == NULL)return ; if(root) { DestroyTree(root->lchild); DestroyTree(root->rchild); } free(root); root = NULL; } int main() { btree *root; char str[maxitem]; gets(str); strcat(str,"#"); root = CreatTree(str); LevelOrderTree(root); DestroyTree(root); return 0; }
相关文章推荐
- 一步一步复习数据机构和算法基础-二叉树创建(前序建立二叉树)
- 一步一步复习数据结构和算法基础-二叉树基本操作
- 一步一步复习数据结构和算法基础(1)
- 二叉树的建立和基础操作<二> —— (层次遍历和计算二叉树的宽度)
- 一步一步复习数据结构和算法基础-栈的应用(2)
- 一步一步复习数据结构和算法基础-广度优先搜索
- 一步一步复习数据结构和算法基础-LSD基数排序
- 一步一步复习数据结构和算法基础-链表(1)
- 数据结构与算法问题 二叉树的建立与遍历(含非递归)
- 一步一步复习数据结构和算法基础--kruskal算法
- 一步一步复习数据结构和算法基础-快速排序
- 第十周 数据结构例程——二叉树的层次遍历算法
- 一步一步复习数据结构和算法基础-线性表
- 一步一步复习数据结构和算法基础-栈和队列(2)
- 一步一步复习数据结构和算法基础-堆分配存储表示串
- 一步一步复习数据结构和算法基础-索引顺序表查找
- 一步一步复习数据结构和算法基础-Floyd算法
- 一步一步复习数据结构和算法基础-单链表冒泡排序
- 数据结构二叉树——建立二叉树、中序递归遍历、非递归遍历、层次遍历
- 一步一步复习数据结构和算法基础-前序线索二叉树