常用的数据结构之二叉树的递归与非递归的遍历。
2019-04-13 22:47
387 查看
编程光看伪代码是不行滴。理解了一个算法的思路,就转换为自己的风格。就从二叉树的遍历开始吧!
1.1
前序递归遍序
递归代码虽然非常简洁,但是它要调用很多的系统资源,容易爆栈。所以掌握非递归的算法也是很重要的。
[code]void preorder(BT*p){ if(p!=NULL){ vist(p); preorder(p->left);//先遍历左子树 preorder(p->right);//后遍历右子树 } }
1.2
前序非递归遍历
用户通过自己定义栈,从而减少了系统开支。
[code]struct BT { int data; struct BT *right; struct BT *left; }; void preorder(BT*bt){ if(bt!=NULL){ int top=-1; BT*p ; BT *stack[maxsize]; stack[++top]=bt; while(top!=-1){ p=stack[top--]; vis(p); if(p->right!=NULL)//注意先入右节点,再入左节点。根据栈的后入先出。 stack[++top]=p->right; if(p->left!=NULL) stack[++top]=p->left; } } }
2.1中序递归遍历
[code]void midoreder(BT*bt){ BT*p; int stack[maxe]; if(bt!=NULL){ midorder(p->left);//先遍历左子树 visit(p); midorder(p->right);//最后遍历右子树 } }
2.2中序非递归遍历
[code]void midorder(BT*bt){ int top=-1; int stack[maxe]; BT*p=bt; if(bt!=NULL){ while(top!=-1||p!=NULL){ while(p!=NULL){ stack[++top]=p; p=p->left; } if(top!=-1){ p=stack[top--]; vist(P); p=p->right; } } } }
3.1 后序递归遍历
[code]void afterorder(BT * P){ afterorder(p->left); afterorder(p->right); vist(p); }
3.2 后序非递归遍历
后序的非递归遍历是建立前序的基础上,也即是前序递归遍历的镜像,反转一下。所以结合栈的性质,我们可以再前序递归遍历的基础上,再开一个栈。原理,在前序遍历基础下,如 右节点,根,左节点,换成后序遍历就是左节点,根,右节点。所以将前序每遍历一个节点,就同时把它压入另一个栈中,这个另一个栈的出栈顺序就是后序遍历的顺序。代码如下。
[code]ffrrafterorder(BT *bt) { BT *p; int topf=-1;//第一个栈顶 int tops=-1;//第二个栈顶 BT *stack1[maxe]; BT*stack2[maxe]; if(bt!=NULL){ stack1[++top]=bt; while(top1!=-1){ p=stack1s[top1--]; stack2[++tops]=p; if(p->right!=NULL){ stack1[++topf]=p->right; } if(p->left!=NULL){ stack1[++topf]=p->left; } } while(tops!=-1){ p=stack2[tops--]; visit(p); } } }
相关文章推荐
- 数据结构--树:二叉树的遍历方式(递归和非递归)
- Java数据结构:二叉树的前序,中序,后序遍历(递归和非递归)
- c语言数据结构--二叉树的遍历(递归与非递归)
- 【数据结构】二叉树的遍历(递归与非递归)
- 数据结构:二叉树的前序,中序,后序遍历(递归和非递归)
- 数据结构---二叉树的前序、中序、后序遍历的递归和非递归 实现(C++)
- 二叉树的遍历--递归+非递归
- 二叉树创建及遍历算法(递归及非递归)
- 数据结构-二叉树(递归前序、中序、后序遍历;栈实现中序变量;二叉树镜像)
- Coding interview: 二叉树的遍历(递归和非递归)
- 二叉树的几种遍历递归与非递归java实现
- 二叉树(利用栈和队列实现递归和非递归遍历,构建等)
- 二叉树的遍历--递归和非递归
- 二叉树递归与非递归遍历的方法
- 数据结构笔记--二叉树的非递归遍历与按层遍历分析
- 二叉树前、中、后序遍历(递归与非递归)
- C++二叉树之构造拷贝赋值,递归和非递归的前序遍历,中序遍历和后序遍历,以及层序遍历
- 二叉树的遍历--递归+非递归
- 二叉树非递归遍历--前序中序(常用)后序遍历
- 数据结构与算法问题 二叉树的建立与遍历(含非递归)