二叉树的非递归中序遍历以及层序遍历实现
来源:互联网 发布:淘宝二级域名有啥用 编辑:程序博客网 时间:2024/05/29 12:35
代码”Types.h“:
/*Types.h*/#ifndef _TYPES_H#define _TYPES_Htypedef char ElemType;typedef struct BTNode{ElemType data;BTNode * lChild;BTNode * rChild;}BTNode,*BTree;typedef BTree Item;typedef struct STNode{Item data;STNode *link;}STNode,*LinkStack;typedef struct QNode *pQNode;typedef struct QNode{Item data;QNode *link;}QNode;typedef struct Queue{pQNode front;pQNode rear;}Queue,*LinkQueue;void CopyElem(ElemType *dest,ElemType *src);void CopyItem(Item *dest,Item *src);#endif代码”Types.cpp“:
/*Types.cpp*/#include "Types.h"void CopyElem(ElemType *dest,ElemType *src){*dest = *src;}void CopyItem(Item *dest,Item *src){*dest = *src;}/*LinkStack.h*/:
/*LinkStack.h*/#ifndef __LINK_STACK__H#define __LINK_STACK__H #include "Types.h"void Copy(Item *dest,Item *src);void InitStack(LinkStack *T);void Push(LinkStack *T,Item item);void Pop(LinkStack *T,Item *item);Item Top(LinkStack T);bool Isempty(LinkStack T);void Destroy(LinkStack *T);void PrintStack(LinkStack T);#endif/*LinkStack.cpp*/:
/*LinkStack.cpp*/#include "LinkStack.h" #include <iostream>using namespace std;void Copy(Item *dest,Item *src){CopyItem(dest,src);}void InitStack(LinkStack *T){*T = NULL;} bool Isempty(LinkStack T){return (T == NULL);}void Push(LinkStack *T,Item item){STNode *p = new STNode;Copy(&(p->data),&item);p->link = NULL;//cannot be missedif(Isempty(*T)){*T = p;}else{p->link = *T;*T = p;}} void Pop(LinkStack *T,Item *item){if(Isempty(*T)){/*Item v = NULL;Copy(item,&v);*/Item v = NULL;Copy(item,&v);return;}STNode *tmp = (*T);Copy(item,&(tmp->data));*T = (*T)->link;delete tmp;} Item Top(LinkStack T){if(!Isempty(T))return T->data;} void Destroy(LinkStack *T){if(!Isempty(*T)){STNode *tmp = *T;*T = (*T)->link;delete tmp;}}void PrintStack(LinkStack T){STNode *tmp = T;while(tmp){cout<<"node : "<<tmp->data<<endl;tmp = tmp->link; }}
/*LinkQueue.h*/:
/*LinkQueue.h*/#ifndef _LINKQUEUE_H#define _LINKQUEUE_H#include "Types.h"void CopyQueueItem(Item *dest,Item *src); void InitQueue(LinkQueue* Q);void Enqueue(LinkQueue Q,Item item);void Dequeue(LinkQueue Q,Item *item);Item Front(LinkQueue Q);bool Isempty(LinkQueue Q);void Clear(LinkQueue *Q);void PrintQueue(LinkQueue Q);#endif
/*LinkQueue.cpp*/:
/*LinkQueue.cpp*/#include "LinkQueue.h"#include <iostream>using namespace std;void CopyQueueItem(Item *dest,Item *src){CopyItem(dest,src);}void InitQueue(LinkQueue* Q){*Q = new Queue;(*Q)->front = NULL;(*Q)->rear = NULL;}void Enqueue(LinkQueue Q,Item item){pQNode p = new QNode;CopyQueueItem(&(p->data),&item);p->link = NULL;if(Q->rear == NULL){Q->front = Q->rear = p;}else{Q->rear->link = p;Q->rear = p;}}void Dequeue(LinkQueue Q,Item *item){if(!Isempty(Q)){pQNode p = Q->front;CopyQueueItem(item,&(p->data));if (Q->front == Q->rear)Q->front = Q->rear = NULL;elseQ->front = Q->front->link;delete p;}else*item = NULL;}Item Front(LinkQueue Q){return Q->front->data;}bool Isempty(LinkQueue Q){return Q == NULL || Q->rear == NULL;}void Clear(LinkQueue *Q){pQNode p = (*Q)->front;pQNode tmp; while(p){tmp = p->link;delete p;p = tmp;}delete (*Q);(*Q) = NULL;}void PrintQueue(LinkQueue Q){pQNode p = Q->front;cout<<"Queue currently Start:"<<endl;while(p){cout<<"Qnode : "<<p->data<<endl;p = p->link;}cout<<"Queue End."<<endl;}/*BinTree.h*/:
/*BinTree.h*/#ifndef _BINTREE_H#define _BINTREE_H#include "Types.h" #include "BinTree.h"#include "LinkStack.h"#include "LinkQueue.h"void InitBTree(BTree *T);void CreateBTree(BTree *T);void DestroyBTree(BTree *T);void PreOrderTraverse(BTree T);void InOrderTraverse(BTree T);void PostOrderTraverse(BTree T);void InOrder2(BTree T);void LevelOrder(BTree T);#endif/*BinTree.cpp*/:
/*BinTree.cpp*/#include "BinTree.h"#include <iostream>using namespace std;void InitBTree(BTree *T){*T = NULL;}void CreateBTree(BTree *T){ElemType item;cin>>item;if(item=='#'){*T = NULL;}else {*T = new BTNode;CopyElem(&((*T)->data),&item);CreateBTree(&((*T)->lChild));CreateBTree(&((*T)->rChild));}}void DestroyBTree(BTree *T){if(*T){DestroyBTree(&((*T)->lChild));DestroyBTree(&((*T)->rChild));delete (*T);*T = NULL;}} void PreOrderTraverse(BTree T){if(T){cout<<"node : "<<T->data<<endl;PreOrderTraverse(T->lChild);PreOrderTraverse(T->rChild);}} void InOrderTraverse(BTree T){if(T){InOrderTraverse(T->lChild);cout<<"node : "<<T->data<<endl;InOrderTraverse(T->rChild);}} void PostOrderTraverse(BTree T){if(T){PostOrderTraverse(T->lChild);PostOrderTraverse(T->rChild);cout<<"node : "<<T->data<<endl;}} void InOrder2(BTree T){LinkStack s;InitStack(&s);for(;;){for(;T;T=T->lChild)Push(&s,T);Pop(&s,&T);if(!T)break;cout<<"Node : "<<T->data<<endl;T = T->rChild;}Destroy(&s);}void LevelOrder(BTree T){if(!T)return;LinkQueue Q ;InitQueue(&Q);Enqueue(Q,T);BTree ptr;for(;;){Dequeue(Q,&ptr);if(ptr){cout<<"Node : "<<ptr->data<<endl;if(ptr->lChild)Enqueue(Q,ptr->lChild);if(ptr->rChild)Enqueue(Q,ptr->rChild);}elsebreak;}}测试主程序:
*/#include <iostream>#include "BinTree.h"#include "LinkStack.h"#include "LinkQueue.h"using namespace std;int main(){ BTree tree;InitBTree(&tree);CreateBTree(&tree);cout<<"Pre Order:"<<endl;PreOrderTraverse(tree);cout<<"In Order:"<<endl;InOrderTraverse(tree);cout<<"Post Order:"<<endl;PostOrderTraverse(tree);cout<<"In Order 2(using stack):"<<endl;InOrder2(tree);cout<<"Pre Order:"<<endl;PreOrderTraverse(tree);cout<<"Level Order:"<<endl;LevelOrder(tree);DestroyBTree(&tree);}输入:
ABD##E##CF###
输出:
Pre Order:node : Anode : Bnode : Dnode : Enode : Cnode : FIn Order:node : Dnode : Bnode : Enode : Anode : Fnode : CPost Order:node : Dnode : Enode : Bnode : Fnode : Cnode : AIn Order 2(using stack):Node : DNode : BNode : ENode : ANode : FNode : CPre Order:node : Anode : Bnode : Dnode : Enode : Cnode : FLevel Order:Node : ANode : BNode : CNode : DNode : ENode : F
0 0
- 二叉树的非递归中序遍历以及层序遍历实现
- 二叉树的前序,中序,后序的递归与非递归遍历以及按层遍历
- 二叉树的,前/中/后序的遍历( 递归,非递归),层序遍历,以及各种应用功能
- C++二叉树之构造拷贝赋值,递归和非递归的前序遍历,中序遍历和后序遍历,以及层序遍历
- 二叉树的创建、前序中序后序递归遍历与非递归遍历、层序遍历以及二叉树简单应用的C语言实现
- C++实现二叉树的递归遍历与非递归遍历(先序、中序、后序、层序)
- 【数据结构与算法】二叉树的遍历(递归遍历、非递归遍历、层序遍历)
- 二叉树的遍历:前序、中序、后序、层序的非递归实现
- C++实现二叉树的非递归遍历(层,前,中,后序)
- 数据结构的C实现_二叉树的非递归遍历和层序遍历
- 实现二叉树的先序遍历、中序遍历、后序遍历的递归非递归算法以及层次遍历算法
- C# 二叉树的非递归中序 前序 后序遍历 层序遍历
- leetcode | 二叉树的前序遍历、中序遍历、后续遍历的非递归实现
- 二叉树的先序遍历、中序遍历以及后序遍历(递归以及非递归方式)
- 非递归实现二叉树的后序遍历、前序遍历、中序遍历
- 二叉树前后中序遍历的非递归实现
- 二叉树的非递归实现中序遍历
- 二叉树(一) 先序遍历、中序遍历、后续遍历、层次遍历的递归与非递归实现
- cocos2dx 3.0正式版 在mac上新建项目
- 浪好幸粗魏切揖慷咆称掀邑檀星徘
- rdesktop使用
- 侥显堵够滞疑缆识娇置钠朔谘特涌
- 裙谠仁浩屑毁痴焚以疑邮泊邮雷液
- 二叉树的非递归中序遍历以及层序遍历实现
- CC++初学者编程教程(2) Microsoft Visual C++ 6.0开发环境搭建
- 利用事件同步,互斥线程
- sql 2005 用户 sa 登录失败一系列问题
- 进程与端口映射
- 一个java操作ini格式文件的工具类,支持增删查改,不过由于项目所需,只做了针对单行的操作。写得不好求指教。
- 追肮恐乩斩疑叵慷镜菊呈苍谘霖涎
- 解决Android与服务器交互大容量数据问题
- listview 保存滑动的位置。