二叉树的先序、中序以及后序遍历(递归与非递归方法)
来源:互联网 发布:会员卡读卡数据 编辑:程序博客网 时间:2024/05/18 03:26
各种遍历的非递归方法使用堆栈作为辅助,定义的头文件如下:
#define OK 1#define ERROR -1#define TRUE 1#define FALSE 0typedef int Status;typedef char TElemType;//二叉树数据类型typedef struct BiTNode{TElemType data;struct BiTNode *lchild, *rchild;}BiTNode, *BiTree;//二叉树结点typedef BiTree SElem;//堆栈中元素数据类型typedef struct SNode{SElem e;struct SNode *next;}SNode;//堆栈链表结点typedef struct {SNode *base, *top;int size;}Stack;//堆栈链表Status InitStack(Stack &S);//初始化堆栈Status StackEmpty(Stack S);//判断堆栈是否为空Status Push(Stack &S, SElem e);//压栈Status Pop(Stack &S, SElem &e);//出栈Status CreateBiTree(BiTree &T);//先序构造二叉树Status PreOrderTraverse(BiTree T, Status (*Visit)(TElemType e));//先序遍历Status InOrderTraverse(BiTree T, Status (*Visit)(TElemType e));//中序遍历Status PostOrderTraverse(BiTree T, Status (*Visit)(TElemType e));//后序遍历
1.1先序遍历(非递归算法)
Status PreOrderTraverse(BiTree T, Status (*Visit)(TElemType e)){BiTree p;Stack S;InitStack(S);p = T;while(p || !StackEmpty(S)){if(p){if(!Visit(p->data))return ERROR;Push(S, p->rchild);p = p->lchild;}elsePop(S, p);}return OK;}
Status PreOrderTraverse(BiTree T, Status (*Visit)(TElemType e)){if(T){if(Visit(T->data))if(PreOrderTraverse(T->lchild, Visit))if(PreOrderTraverse(T->rchild, Visit))return OK;return ERROR;}elsereturn ERROR;}
2.1中序遍历(非递归算法)
Status InOrderTraverse(BiTree T, Status (*Visit)(TElemType e)){Stack S;InitStack(S);BiTNode *cur = T;while(cur || !StackEmpty(S)){if(cur){Push(S, cur);cur = cur->lchild;}else{ if(!StackEmpty(S)) { Pop(S, cur); if(!Visit(cur->data))return ERROR; cur = cur->rchild; }}}return OK;}
2.2中序遍历(递归算法)
Status InOrderTraverse(BiTree T, Status (*Visit)(TElemType e)){if(T){if(InOrderTraverse(T->lchild, Visit))if(Visit(T->data))if(InOrderTraverse(T->rchild, Visit))return OK;return ERROR;}elsereturn ERROR;}
3.1后序遍历(非递归算法)
//要保证根结点在左孩子和右孩子访问之后才能访问,因此对于任一结点P,//先将其入栈。如果P不存在左孩子和右孩子,则可以直接访问它;或者P存在左孩子或者//右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点。若非上//述两种情况,则将P的右孩子和左孩子依次入栈,这样就保证了每次取栈顶元素的时候,//左孩子在右孩子前面被访问,左孩子和右孩子都在根结点前面被访问。Status PostOrderTraverse(BiTree T, Status (*Visit)(TElemType e)){SElem elem;BiTNode *cur = T;BiTNode *pre = NULL;Stack S;InitStack(S);Push(S, cur);while(!StackEmpty(S)){cur = S.top->e;//取栈顶元素if((cur->lchild == NULL && cur->rchild == NULL) ||(pre != NULL && (pre == cur->lchild || pre == cur->rchild))){Visit(cur->data);Pop(S, elem);pre = cur;}else{if(cur->rchild != NULL) Push(S, cur->rchild); if(cur->lchild != NULL) Push(S, cur->lchild);}}return OK;}
3.2后序遍历(递归算法)
Status PostOrderTraverse(BiTree T, Status (*Visit)(TElemType e)){if(T){if(PostOrderTraverse(T->lchild, Visit))if(PostOrderTraverse(T->rchild, Visit))if(!Visit(T->data))return OK;return ERROR;}elsereturn ERROR;}
0 0
- 二叉树的先序、中序以及后序遍历(递归与非递归方法)
- 二叉树的先序、中序、后序遍历方法(递归与非递归方法)——《数据结构》
- 二叉树的先序遍历、中序遍历以及后序遍历(递归以及非递归方式)
- 二叉树的先序递归以及非递归遍历
- 二叉树的先序/中序/后序(递归、非递归)+层序遍历
- 二叉树的先序、中序、后序遍历(递归 and 非递归)
- 数据结构——二叉树的递归与非递归遍历(先序,中序,后序)
- 二叉树的先序、中序、后序递归遍历和非递归遍历
- 二叉树的先序,中序,后序及其非递归遍历的方法
- 二叉树的先序、中序、后序的递归及非递归实现,以及层次遍历的实现:
- 二叉树遍历 递归与非递归 先序-中序-后序
- C++实现二叉树的递归遍历与非递归遍历(先序、中序、后序、层序)
- 二叉树遍历(先序遍历、中序遍历、后序遍历)——递归方法和非递归方法
- 二叉树2:层次遍历方式及先序、中序、后序(递归与非递归)遍历方式
- 二叉树的先序、中序、后序遍历的递归和非递归实现
- 二叉树的先序、中序、后序、层序递归及非递归遍历
- 二叉树的遍历 中序 后序 先序 递归 非递归
- 二叉树的创建和先序,中序,后序,递归,非递归遍历
- 二叉树创建,遍历和求最大值
- 集群与负载均衡系列——nginx实现tomcat集群与负载均衡(1)
- 用usb to ttl线给stm32f103zet6开发板下载程序
- Spiral Matrix II
- 白盒测试技术
- 二叉树的先序、中序以及后序遍历(递归与非递归方法)
- 深入理解Java中的String类型
- Linux--RH134---unit 4 管理系统中的简单分区和文件系统
- 部分阉割版Win7无法正常使用TTS语音的解决办法
- 17chd校赛E题 Colorful Ribbon(dp)
- UE4材质渲染模式
- web项目log4j.properties配置
- 关于java中的本地缓存-总结概
- 中国大学MOOC-陈越、何钦铭-数据结构-2017春期中考试