二叉树的递归遍历与非递归遍历
来源:互联网 发布:数据分析的对比分析法 编辑:程序博客网 时间:2024/05/17 07:14
二叉树的遍历方式分别有三种:先序,后序,中序。
而每种遍历都分别有俩种方式:递归与非递归。
递归算法很短:
先序:
void preorder(){ cout << data << " "; if(lchild != NULL){ lchild->preorder(); } if(rchild != NULL){ rchild->preorder(); }}中序:
void inorder(){ if(lchild != NULL){ lchild->inorder(); } cout << data << " "; if(rchild != NULL){ rchild->inorder(); }}
后序:
void postorder(){ if(lchild != NULL){ lchild->inorder(); } if(rchild != NULL){ rchild->inorder(); } cout << data << " ";}而对于非递归算法:
如下为截至http://blog.csdn.net/ns_code/article/details/12977901/朋友的一篇引用。
1、前序遍历的非递归实现
根据先序遍历的顺序,先访问根节点,再访问左子树,后访问右子树,而对于每个子树来说,又按照同样的访问顺序进行遍历,上图的先序遍历顺序为:ABDECF。非递归的实现思路如下:
对于任一节点P,
1)输出节点P,然后将其入栈,再看P的左孩子是否为空;
2)若P的左孩子不为空,则置P的左孩子为当前节点,重复1)的操作;
3)若P的左孩子为空,则将栈顶节点出栈,但不输出,并将出栈节点的右孩子置为当前节点,看其是否为空;
4)若不为空,则循环至1)操作;
5)如果为空,则继续出栈,但不输出,同时将出栈节点的右孩子置为当前节点,看其是否为空,重复4)和5)操作;
6)直到当前节点P为NULL并且栈空,遍历结束。
具体实现:
void pre_traverse(BTree pTree) { PSTACK stack = create_stack(); //创建一个空栈 BTree node_pop; //用来保存出栈节点 BTree pCur = pTree; //定义用来指向当前访问的节点的指针 //直到当前节点pCur为NULL且栈空时,循环结束 while(pCur || !is_empty(stack)) { //从根节点开始,输出当前节点,并将其入栈, //同时置其左孩子为当前节点,直至其没有左孩子,及当前节点为NULL printf("%c ", pCur->data); push_stack(stack,pCur); pCur = pCur->pLchild; //如果当前节点pCur为NULL且栈不空,则将栈顶节点出栈, //同时置其右孩子为当前节点,循环判断,直至pCur不为空 while(!pCur && !is_empty(stack)) { pCur = getTop(stack); pop_stack(stack,&node_pop); pCur = pCur->pRchild; } } }
在理解过程中不是特别的顺畅,于是,同样利用栈实现,本人思路如下:
1)建立一个空栈。
2)将目标结点放置栈中。
3)输出结点数据域,弹出栈顶元素。
4)判断栈顶结点右结点是否为空,若不为空则加入栈中。
5)判断栈顶结点左结点是否为空,若不为空则加入栈中。
6)若栈不为空,则3,4,5步循环操作。
实现代码:
void preorder1(){ stack<Node*> st; Node* cur = this; st.push(cur); while(!st.empty()){ cur = st.top(); cout << cur->data << " "; st.pop(); if(cur->rchild != NULL){ st.push(cur->rchild); } if(cur->lchild != NULL){ st.push(cur->lchild); } } }得出结果:
demo建立:
阅读全文
0 0
- 二叉树的递归遍历与非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树 递归 与 非递归 遍历
- 递归与非递归二叉树遍历
- 二叉树递归与非递归遍历
- 二叉树递归与非递归遍历
- 二叉树递归与非递归遍历
- 二叉树递归与非递归遍历
- 二叉树递归与非递归遍历
- 遍历二叉树(递归与非递归)
- 二叉树的先中后序遍历,递归遍历,非递归遍历
- 【数据结构与算法】二叉树的遍历(递归遍历、非递归遍历、层序遍历)
- 拉格朗日乘数法
- arcgis——arcCatalog 10.2 创建企业级数据库
- freemarker的使用心得
- iText7报错com.itextpdf.kernel.font.PdfType0Font.getCidFontType2(PdfType0Font.java:720)解决
- 一个非常简单的spring-boot web项目(一)
- 二叉树的递归遍历与非递归遍历
- 在Mac上直接使用Python2.7版本
- DS.Lab筆記
- spice性能优化
- copy文章方法
- SJA1000控制器详解
- hack this site-level 1 the idiot test
- 很全面的freemarker教程
- 整数排序