数据结构-二叉树的各种遍历(先中后层序!!)
来源:互联网 发布:iphone用电脑网络上网 编辑:程序博客网 时间:2024/06/05 06:16
最近在写数据结构中二叉树的遍历,这里总结一下:
先序递归遍历:
void PreTravel(BiTree T){//前序递归遍历if(T){ printf("%c",T->data);PreTravel(T->lchild);PreTravel(T->rchild);}}
中序递归遍历:
void MidTravel(BiTree T){//中序递归遍历if(T){ MidTravel(T->lchild);printf("%c",T->data);MidTravel(T->rchild);}}
后序递归遍历:
void PostTravel(BiTree T){//后序递归遍历if(T){ PostTravel(T->lchild);PostTravel(T->rchild);printf("%c",T->data);}}
先序非递归遍历:
void PreOrder(BiTree &T){//先序非递归遍历 stack<BiTree> s;BiTree p = T;while(p || !s.empty()){if(p){printf("%c", p->data);s.push(p);p = p->lchild;}else{p = s.top();s.pop();p = p->rchild;} }}
中序非递归遍历:
void InOrder(BiTree T){//中序非递归遍历 stack<BiTree> s;BiTree p = T;while(p || !s.empty()){if(p){s.push(p);p = p->lchild;}else {p = s.top();printf("%c", p->data);s.pop();p = p->rchild;}}}
后序非递归遍历:
void PostOrder(BiTree &T){//后序非递归遍历(加入一个标志变量visit,判断左右子树是否进栈) stack<BiTree> s;BiTree p = T;p->visit = false;if(T) s.push(T);while(!s.empty()){p = s.top();if(p->visit){printf("%c", p->data);s.pop();}else {if(p->rchild){p->rchild->visit = false;s.push(p->rchild);}if(p->lchild){p->lchild->visit = false;s.push(p->lchild);}p->visit = true;}}}
void PostOrder1(BiTree &T){//后序非递归遍历 (销毁了树的结构,不可取)stack<BiTree> s;BiTree q, p = T;while(p || !s.empty()){if(p){s.push(p);q = p;p = q->lchild;q->lchild = NULL;}else {q = s.top();p = q->rchild;q->rchild = NULL;if(p){s.push(p);q = p;p = q->lchild;q->lchild = NULL;}else {p = s.top();printf("%c", p->data);s.pop();if(!s.empty()){p = s.top();p = p->lchild;}else return;}}}}
层序遍历:
void LevelOrder(BiTree &T){//层序遍历 queue<BiTree> q;q.push(T);BiTree p;while(!q.empty()){p = q.front();printf("%c", p->data);q.pop();if(p->lchild)q.push(p->lchild);if(p->rchild)q.push(p->rchild);}}
主函数调用:
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <cstdlib>#include <stack>#include <queue>#include "constant.h"using namespace std;typedef struct BiTNode{char data;bool visit; struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;void Print(char a){printf("%c", a);return;}void CreatBiTree(BiTree &T){//前序法创建二叉树char ch;if((ch=getchar())=='#')T=NULL;else{T=(BiTNode*)malloc(sizeof(BiTNode));if(!T)exit(1);T->data=ch;CreatBiTree(T->lchild);CreatBiTree(T->rchild);}}void PreTravel(BiTree T){//前序递归遍历if(T){ printf("%c",T->data);PreTravel(T->lchild);PreTravel(T->rchild);}}void MidTravel(BiTree T){//中序递归遍历if(T){ MidTravel(T->lchild);printf("%c",T->data);MidTravel(T->rchild);}}void PostTravel(BiTree T){//后序递归遍历if(T){ PostTravel(T->lchild);PostTravel(T->rchild);printf("%c",T->data);}}void PreOrder(BiTree &T){//先序非递归遍历 stack<BiTree> s;BiTree p = T;while(p || !s.empty()){if(p){printf("%c", p->data);s.push(p);p = p->lchild;}else{p = s.top();s.pop();p = p->rchild;} }} void InOrder(BiTree T){//中序非递归遍历 stack<BiTree> s;BiTree p = T;while(p || !s.empty()){if(p){s.push(p);p = p->lchild;}else {p = s.top();printf("%c", p->data);s.pop();p = p->rchild;}}} void PostOrder(BiTree &T){//后序非递归遍历(加入一个标志变量visit,判断左右子树是否进栈) stack<BiTree> s;BiTree p = T;p->visit = false;if(T) s.push(T);while(!s.empty()){p = s.top();if(p->visit){printf("%c", p->data);s.pop();}else {if(p->rchild){p->rchild->visit = false;s.push(p->rchild);}if(p->lchild){p->lchild->visit = false;s.push(p->lchild);}p->visit = true;}}}void PostOrder1(BiTree &T){//后序非递归遍历 (销毁了树的结构,不可取)stack<BiTree> s;BiTree q, p = T;while(p || !s.empty()){if(p){s.push(p);q = p;p = q->lchild;q->lchild = NULL;}else {q = s.top();p = q->rchild;q->rchild = NULL;if(p){s.push(p);q = p;p = q->lchild;q->lchild = NULL;}else {p = s.top();printf("%c", p->data);s.pop();if(!s.empty()){p = s.top();p = p->lchild;}else return;}}}} void LevelOrder(BiTree &T){//层序遍历 queue<BiTree> q;q.push(T);BiTree p;while(!q.empty()){p = q.front();printf("%c", p->data);q.pop();if(p->lchild)q.push(p->lchild);if(p->rchild)q.push(p->rchild);}}int main(){ BiTree T;printf("please input the bitree:\n" ); CreatBiTree(T);printf("The Pretravel is:\n");PreTravel(T);printf("\n");PreOrder(T);printf("\n");printf("The Midtravel is:\n");MidTravel(T);printf("\n");InOrder(T);printf("\n");printf("The PostTravel is:\n");PostTravel(T);printf("\n");PostOrder(T);printf("\n");printf("The LevelTravel is:\n");LevelOrder(T);printf("\n");PostOrder1(T);printf("\n");return 0;}
1 0
- 数据结构-二叉树的各种遍历(先中后层序!!)
- 数据结构 二叉树的建立 与各种遍历
- 数据结构基础 各种遍历还原二叉树
- 二叉树的各种遍历
- 二叉树的各种遍历
- 二叉树的各种遍历
- 二叉树的各种遍历
- 二叉树的各种遍历
- 二叉树的各种遍历
- 数据结构二叉树的遍历(二)
- 遍历二叉树的各种操作(非递归遍历)
- 遍历二叉树的各种操作(非递归遍历)
- 遍历二叉树的各种操作(非递归遍历)
- 遍历二叉树的各种操作(非递归遍历)
- 遍历二叉树的各种操作(非递归遍历)
- 遍历二叉树的各种操作(非递归遍历)
- 遍历二叉树的各种操作(非递归遍历)
- 遍历二叉树的各种操作(非递归遍历)
- sleep和wait的区别
- LeetCode[Tree]: Binary Tree Level Order Traversal II
- IO-00. Hello World! (5)
- 谈谈自己对线性最小二乘和非线性最小二乘之间关系的理解~
- 人品计算器
- 数据结构-二叉树的各种遍历(先中后层序!!)
- 音频编码之opus(一)
- NSMutableString
- 用栈实现的模拟计算器程序
- Lowest Common Multiple Plus
- php面试题
- vb开发APK安卓应用BASIC语法写手机程序
- RSA算法的图形化dialog代码
- Oracle数据导入导出imp/exp命令 [转]