遍历二叉树

来源:互联网 发布:北外网络教育多少钱 编辑:程序博客网 时间:2024/06/05 14:34

二叉树的遍历包括递归和非递归。

非递归中又可以分为先序、中序、后序遍历(利用栈实现)和层次遍历(利用队列实现)。代码如下:

//实现二叉树的先序、中序、后序、层次遍历#include<iostream>#include<stack>#include<queue>using namespace std;typedef struct BiTreeNode{char data;BiTreeNode *lchild;BiTreeNode *rchild;}*BiTree;//创建一个二叉树void CreatBiTree(BiTree &root){char data;data=getchar();if(data=='#')root=NULL;else{root=new BiTreeNode();root->data=data;CreatBiTree(root->lchild);CreatBiTree(root->rchild);}}//中序遍历-利用栈void InOrderTraverse1(BiTreeNode *T){BiTreeNode *p;stack<BiTreeNode*> S;S.push(T);while(!S.empty()){while(p=S.top())//向左遍历直到为空{p=p->lchild;S.push(p);}S.pop();//空指针出栈if(!S.empty())//访问节点向右一步{p=S.top();cout<<p->data<<" ";S.pop();p=p->rchild;S.push(p);}}cout<<endl;}//中序遍历-利用栈void InOrderTraverse2(BiTreeNode *T){BiTreeNode *p=T;stack<BiTreeNode*> S;while(p||!S.empty()){if(p)//根指针进栈,遍历左子树{S.push(p);p=p->lchild;}else//根指针退栈,访问根节点,遍历右子数{p=S.top();cout<<p->data<<" ";S.pop();p=p->rchild;}}cout<<endl;}//先序遍历-利用栈void PreOrderTraverse(BiTreeNode *T){stack<BiTreeNode*> S;BiTreeNode *p=T;while(p||!S.empty()){while(p)//访问根节点,右子树进栈,向左走到尽头{cout<<p->data<<" ";S.push(p->rchild);p=p->lchild;}if(!S.empty()){p=S.top();S.pop();}}cout<<endl;}//后序遍历-利用栈//必须分清返回根节点时,是从左子树返回的,还是从右子树返回的。//故添加一个辅助指针,其指向最近访问过的节点void PostOrderTraverse(BiTreeNode *T){stack<BiTreeNode*> S;BiTreeNode *p=T;BiTreeNode *r=NULL;//指向最近访问过的结点while(p||!S.empty()){if(p)//根指针进栈,遍历左子树{S.push(p);p=p->lchild;}else{ p=S.top(); if(p->rchild&&p->rchild!=r)//左子树为空,右子树不为空且未被访问 { p=p->rchild; S.push(p); p=p->lchild; } else//访问根节点 { S.pop(); cout<<p->data<<" "; r=p; p=NULL; }}}cout<<endl;}//层次遍历-利用队列void HierarchyBiTree(BiTreeNode *T){queue<BiTreeNode*> Q;BiTreeNode *p;Q.push(T);while(!Q.empty()){p=Q.front();Q.pop();cout<<p->data<<" ";if(p->lchild)Q.push(p->lchild);if(p->rchild)Q.push(p->rchild);}cout<<endl;}void main(){BiTree root=NULL;CreatBiTree(root);cout<<"Inuput End!"<<endl;InOrderTraverse1(root);InOrderTraverse2(root);PreOrderTraverse(root);PostOrderTraverse(root);HierarchyBiTree(root);}


0 0
原创粉丝点击