数据结构-二叉树的各种遍历(先中后层序!!)

来源:互联网 发布: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