非递归前序遍历二叉树
来源:互联网 发布:同视机如何看数据 编辑:程序博客网 时间:2024/05/16 09:08
非递归后序遍历二叉树,请看这里。
方法一:递归调用用的是call stack,为了把递归调用转化成非递归调用,我们要想办法用普通的栈代替call stack。
教科书里的非递归前序遍历算法,需要用两个嵌套循环来做。本算法的仅仅需要一个循环就能完成前序遍历。详见preorder1()
初始化:
首先把根节点入栈。
循环以下各步,直至栈为空:
1.出栈;(出栈的时候,打印节点的值);
2.对于刚才被弹出的节点,检查是否有右孩子:有右孩子的话,先把右孩子压栈;然后检查有没有左孩子,有的话再把左孩子入栈。
3.返回到第1步。
方法二:请见preorder2()。方法二和非递归中序遍历的思路非常像。
代码如下:
#include<iostream> #include<stack> using namespace std; class Node { public: int key; // value of node Node* lp; // pointer to left child Node* rp; // pointer to right child Node(int k, Node*lpp, Node* rpp) { key = k; lp = lpp; rp = rpp; } }; void preorder1(Node* root) { std::stack<Node*> st; if(root!=NULL) st.push(root); Node* tmp; while(!st.empty()) { tmp = st.top(); st.pop(); cout<<tmp->key<<endl; if(tmp->rp!=NULL) st.push(tmp->rp); if(tmp->lp!=NULL) st.push(tmp->lp); } } void preorder2(Node* root) //第二种方法{stack<Node*> st;while(root!=NULL || !st.empty()){while(root){printf("%d|", root->value);st.push(root);root = root->left;}if(st.empty())break;else{root = st.top();st.pop();root = root->right;}}} int main() { Node* n1 = new Node(1,NULL,NULL); Node* n2 = new Node(2,NULL,NULL); Node* n3 = new Node(3,n1,n2); Node* n4 = new Node(4,NULL,NULL); Node* n5 = new Node(5,NULL,NULL); Node* n6 = new Node(6,n4,n5); Node* n7 = new Node(7,n3,n6); Node* root = new Node(8,NULL,n7); preorder1(root); preorder2(root);}
- 非递归前序遍历二叉树
- 二叉树的前序遍历(递归+非递归)
- 二叉树非递归前序和中序遍历
- 二叉树的非递归前序、后序遍历
- [算法]二叉树的非递归前序遍历算法
- 前序遍历二叉树非递归写法
- 非递归前序遍历二叉树(图解)
- 二叉树的非递归前序遍历
- lintcode-二叉树的前序遍历(非递归)-66
- 二叉树的非递归前序遍历
- 二叉树 之 非递归前序遍历
- 二叉树的前序遍历(非递归)
- 二叉树的前序遍历---非递归实现
- 二叉树的非递归前序遍历
- 二叉树非递归前、中、后序遍历
- 二叉树非递归前、中、后序遍历实现
- 前序遍历二叉树(非递归)
- 接前-中序遍历二叉树(非递归)
- oracle加密
- 用QT 还是MFC ?
- 2012大众点评网笔试题
- dede 内容页获取当前栏目的链接
- MyEclipse6.5整合SSH(Struts1.x)详细步骤
- 非递归前序遍历二叉树
- 用python做自动化测试--序
- CPU 测速(MHz)和高精度延时(微秒级)
- oracle数据导出
- oracle 数据导入
- sprintf系列函数和可变参数函数
- sprintf和vsprintf相同,但它们不能处理浮点格式。
- atoi()和itoa()的标准源码实现
- android 实现微信摇一摇效果