遍历二叉树
来源:互联网 发布:北外网络教育多少钱 编辑:程序博客网 时间: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
- 二叉树遍历、分层遍历
- 遍历二叉树--二叉树
- 【树】遍历二叉树
- 二叉树遍历
- 二叉树遍历
- 二叉树的遍历
- (原创)遍历二叉树
- 二叉树遍历-php
- 查找--遍历二叉树
- 遍历二叉树
- 二叉树遍历规则
- 二叉树的遍历
- 二叉树遍历
- 遍历二叉树
- 二叉树遍历问题
- 二叉树遍历
- 二叉树遍历(zz)
- 二叉树的遍历
- 9.view 作图过程,讲讲draw/onDraw和drawChild
- echarts设置y轴值间隔
- 【CDOJ 1259】 昊昊爱运动Ⅱ 【bitset状压+线段树】
- 使用Bundle在Activity中来传递数据
- HDU 1408 盐水的故事
- 遍历二叉树
- hdu1432 Lining Up --判断点在一条线上的个数
- length,length(),size()区别
- Android中的Toolbar详解
- RBTree红黑树
- C基础(21——25)
- C基础(26——30)
- C++ STL 之 BitSet
- Head First设计模式整理