(C语言)二叉树层次遍历(数据结构十六)
来源:互联网 发布:算法研究员 编辑:程序博客网 时间:2024/05/18 23:57
1.数据类型定义
在代码中为了清楚的表示一些错误和函数运行状态,我们预先定义一些变量来表示这些状态。在head.h头文件中有如下定义:
//定义数据结构中要用到的一些变量和类型#ifndef HEAD_H#define HEAD_H#include <stdio.h>#include <malloc.h>#include <stdlib.h>#include <math.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2 //分配内存出错typedef int Status; //函数返回值类型typedef int ElemType; //用户定义的数据类型#endif2.层次遍历中我们需要用到队列,定义队列头文件如下LinkQueue.h中代码:
#ifndef LINKQUEUE_H#define LINKQUEUE_H#include "head.h"#include "BiTree.h"//队列中数据类型为树节点typedef pBiNode Type;//队列节点typedef struct Node{Type data;struct Node* next;}Node,*pNode; //队列typedef struct LinkQueue{pNode head;pNode tail;int length;}LinkQueue,*pLinkQueue;//初始化队列Status InitQueue(pLinkQueue &Q){Q=(pLinkQueue)malloc(sizeof(LinkQueue));if(!Q) return OVERFLOW;pNode p=(pNode)malloc(sizeof(Node));if(!p) return OVERFLOW;p->next=NULL;Q->head=p;Q->tail=p;Q->length=0;return OK;}//队列长度Status QueueLength(pLinkQueue Q){if(Q==NULL) return ERROR;return Q->length;}//队列是否为空Status QueueEmpty(pLinkQueue Q){return QueueLength(Q)==0;}//从队尾插入数据Status InsertQueue(pLinkQueue &Q,Type e){pNode q=Q->tail;pNode p=(pNode)malloc(sizeof(Node));p->data=e;p->next=NULL;Q->tail=p;q->next=Q->tail;Q->length++;return true;}//从队头删除数据Status DeleteQueue(pLinkQueue &Q,Type &e){if(QueueLength(Q)<1) return ERROR;pNode p=Q->head;Q->head=p->next;e=Q->head->data;free(p);Q->length--;return true;}#endif3.二叉树头文件 BiTree.h代码如下:
#ifndef BITREE_H#define BITREE_H#include "head.h"typedef struct BiNode{ElemType data;struct BiNode *left,*right;}BiNode,*pBiNode;Status InsertRight(pBiNode &root,ElemType e);Status InsertLeft(pBiNode &root,ElemType e);Status InitBiTree(pBiNode &tree){tree=(pBiNode)malloc(sizeof(BiNode));if(!tree) return OVERFLOW;tree->data=-999999;tree->left=NULL;tree->right=NULL;return OK;}Status BiTreeEmpty(pBiNode root){if(root==NULL) return ERROR;return root->left==root->right && root->data==-999999;}Status HasNoNode(pBiNode root){if(root==NULL) return ERROR;return root->left==root->right ;}Status CreatTreeNode(pBiNode &node,ElemType e){node=(pBiNode)malloc(sizeof(BiNode));if(!node) return OVERFLOW;node->data=e;node->left=NULL;node->right=NULL;return OK;}Status InsertRight(pBiNode &root,ElemType e){if(root->right==NULL){if(e>root->data){pBiNode p;CreatTreeNode(p,e);root->right=p;return OK;}else{pBiNode p;CreatTreeNode(p,e);root->left=p;return OK;}}else{e>root->data? InsertRight(root->right,e):InsertLeft(root,e);}}Status InsertLeft(pBiNode &root,ElemType e){if(root->left==NULL){if(e>root->data){pBiNode p;CreatTreeNode(p,e);root->right=p;return OK;}else{pBiNode p;CreatTreeNode(p,e);root->left=p;return OK;}}else{e<=root->data?InsertLeft(root->left,e):InsertRight(root,e);}}Status InsertTree(pBiNode &root,ElemType e){if(BiTreeEmpty(root)){root->data=e;return true;}if(e>root->data){InsertRight(root,e);}else{InsertLeft(root,e);}}Status CreateBiTree(pBiNode &root,ElemType *a,int n){for (int i=0;i<n;i++){InsertTree(root,a[i]);}return true;} Status print(ElemType e ){ printf("%d ",e); return true; }Status PreOrderTraverse(pBiNode root,Status(*p)(int)){if(root){(*p)(root->data);PreOrderTraverse(root->left,p);PreOrderTraverse(root->right,p);}return OK;}Status MiddleOrderTraverse(pBiNode root,Status(*p)(int)){if(root){MiddleOrderTraverse(root->left,p);(*p)(root->data);MiddleOrderTraverse(root->right,p);}return OK;}Status AfterOrderTraverse(pBiNode root,Status(*p)(int)){if(root){AfterOrderTraverse(root->left,p);AfterOrderTraverse(root->right,p);(*p)(root->data);}return OK;}Status ClearBiTree(pBiNode &root){if(root){ClearBiTree(root->left);ClearBiTree(root->right);free(root);root==NULL;}return OK;}#endif
4.层次遍历二叉树测试代码:
#include "BiTree.h"#include "LinkQueue.h"//层次遍历二叉树void LevelOrder(pBiNode root){pLinkQueue Q; InitQueue(Q); InsertQueue(Q,root);while (!QueueEmpty(Q)){pBiNode e;DeleteQueue(Q,e);printf("%d ",e->data);if (e->left){InsertQueue(Q,e->left);}if (e->right){InsertQueue(Q,e->right);}}}void main(){ElemType a[14]={100,50,200,40,30,45,60,55,61,200,150,300,250,400};pBiNode root;InitBiTree(root);CreateBiTree(root,a,14);printf("前序:");PreOrderTraverse(root,print);printf("\n中序:");MiddleOrderTraverse(root,print);printf("\n后序:");AfterOrderTraverse(root,print);printf("\n层次遍历:");LevelOrder(root);printf("\n");ClearBiTree(root);}
5.插入的二叉树为:
6.层次遍历结果
前序:100 50 40 30 45 60 55 61 200 150 300 250 400中序:30 40 45 50 55 60 61 100 150 200 250 300 400后序:30 45 40 55 61 60 50 150 250 400 300 200 100层次遍历:100 50 200 40 60 150 300 30 45 55 61 250 400
- (C语言)二叉树层次遍历(数据结构十六)
- 数据结构 BFS层次遍历二叉树【C语言版本】
- <数据结构>二叉树的递归、非递归以及层次遍历算法C语言实现
- 数据结构 c语言实现 二叉树的层次遍历(linux下实现)
- 数据结构-层次遍历二叉树
- 数据结构 树 层次遍历二叉树 C语言版
- 数据结构C语言二叉树的遍历
- 二叉树层次遍历(C语言实现)
- C++数据结构--按层次遍历二叉树
- 【数据结构】二叉树的层次遍历
- 【数据结构】二叉树的层次遍历2
- 数据结构 — 5.二叉树层次遍历
- 数据结构—二叉树层次遍历
- 初学数据结构---二叉树层次遍历
- 数据结构_求二叉树的高度以及层次遍历二叉树算法_C语言源代码
- 数据结构--二叉树--层次遍历二叉树(顺序遍历)
- 数据结构-二叉树的遍历(类C语言描述)
- c语言-数据结构-二叉树-生成、遍历代码
- read_image读取图片变量名
- UVa OJ 146
- Android中的EditText默认时不弹出软键盘的方法
- KMP算法介绍及实现——轻松搞定KMP匹配算法
- C/C++中的函数参数传递机制
- (C语言)二叉树层次遍历(数据结构十六)
- 算法系列之KMP算法
- cocos2d-x、CCMenu、CCMenuItem
- 读《浪潮之巅》
- Apache无法启动解决 the requested operation has failed
- Dangling meta character '' near index 0
- 大学计划
- leetcode Gray Code
- 数据结构---------循环队列与链式队列