二叉树的遍历

来源:互联网 发布:爱奇艺网络大电影分成 编辑:程序博客网 时间:2024/06/04 23:28

一:递归遍历

void Order(Binode* bt){if(bt==NULL)return;else{cout<<bt->data;//前序遍历Order(bt->lchild);cout<<bt->data;//中序遍历Order(bt->rchild);cout<<bt->data;//后序遍历}}


二:非递归遍历

前序遍历

void PreOrder(Binode* bt){//采用顺序栈,假定不会发生上溢int top=-1;Binode* S[100];while(bt!=NULL||top!=-1)//两条件都不成立说明遍历结束了{while(bt!=NULL){cout<<bt->data;S[++top]=bt;bt=bt->lchild;}if(top!=-1)//栈非空{bt=S[top--];bt=bt->rchild;}}}

中序遍历

void InOrder(Binode * bt){int top=-1;Binode* A[100];while(bt!=NULL||top!=-1){while(bt!=NULL){A[++top]=bt;bt=bt->lchild;}if(top!=-1){bt=S[top--];cout<<bt->data;bt=bt->rchild;}}}

后序遍历

struct element{Binode* ptr;int flag;}void PostOrder(Binode* bt){int top=-1;element A[100];while(bt!=NULL||top!=-1){while(bt!=NULL){top++;A[top].ptr=bt;A[top].flag=1;bt=bt->lchild;}while(top!=-1&&A[top].flag==2)//第二次出栈的结点才能访问{bt=A[top--].ptr;cout<<bt->data;}if(top!=-1){A[top].flag=2;bt=A[top].ptr->rchild;}}}
层序遍历
void LeverOrder(Binode *bt){Binode* Q[100];int front,rear;front=rear=-1;if(root==NULL)return;Q[++rear]=bt;while(front!=rear){Binode* q=Q[++front];cout<<q.data;if(q->lchild!=NULL)Q[++rear]=q->lchild;if(q->rchild!=NULL)Q[++rear]=q->rchild;}}