【二叉树】实现二叉树的前序、中序、后序的非递归遍历
来源:互联网 发布:贷款抢单软件 编辑:程序博客网 时间:2024/05/18 03:47
二叉树的前序、中序、后序遍历的递归算法很好实现,这就不写了。
非递归的实现肯定要借助栈来实现
前序非递归的实现:根->左->右
实现1、
借助栈的后进先出的思想,将根节点放入栈中,然后访问栈顶元素(根),然后将右孩子入栈,再将左孩子入栈,由于栈是后进先出,所以先出栈的是左孩子,这样就实现了先访问根,再访问左孩子,最后访问右孩子。
void PreOreder_Nor(Node* pRoot){ cout << "前序遍历 "<<endl; if(pRoot == NULL) return ; stack<Node *> s; s.push(pRoot); while(!s.empty()) { Node *pCur = s.top(); //访问根节点 cout << pCur->data << " "; s.pop(); //先右孩子入栈,再左孩子入栈 if(pCur->right) s.push(pCur->right)l; if(pCur->left) s.push(pCur->left); } cout << endl;}
实现2、
void PreOreder_Nor(Node* pRoot){ if(pRoot == NULL) return; stack<Node *> s; Node *p = pRoot; while(p || !s.empty()) { //先访问根节点,左子树,需要借助节点进入右子树 while(p) { s.push(p); cout << p->data <<" "; p = p->left; } //p为空,说明左子树访问完 if(!s.empty()) { p = s.top(); s.pop(); p = p->right; } }}
中序非递归实现:左->根->右
中序非递归,左根右,一样是循环,这次要一直压入左,然后逐个向上遍历根和右。
void InOreder_Nor(Node *pRoot){ if(pRoot == NULL) return ; stack<Node *> s; Node *p = pRoot; while(p || !s.empty()) { while(p) { s.push(p); p = p->left; } //栈顶元素为最左边的节点 //依次访问该节点,并进入右子树 Node *pTop = s.top(); cout << pTop->data<< " "; s.pop(); p = pTop->right;//访问右子树 }}
后序非递归:左->右->根
必须判断右孩子访问完或右孩子为空才能访问根节点。
void PostOreder_Nor(Node *pRoot){ if(pRoot == NULL) return ; stack<Node *> s; Node *p = pRoot; Node *pre = NULL;//标记访问过的节点 while(p || !s.empty()) { while(p) { s.push(p); p = p->left; } //找最左边的孩子 Node *pTop = s.top(); //右孩子访问过或右孩子访问过再访问根 if(pTop->right == NULL || pTop->right == pre) { cout << pTop->data << " "; pre = pTop; s.pop(); } else//先访问右孩子 { p = pTop->right; } }}
阅读全文
4 1
- 【二叉树】实现二叉树的前序、中序、后序的非递归遍历
- 二叉树的非递归【前/中/后 序遍历】
- 非递归实现二叉树的后序遍历、前序遍历、中序遍历
- 二叉树 前序遍历的非递归实现 中序遍历的非递归实现 后序遍历的非递归实现 创建二叉树
- 二叉树非递归前、中、后序遍历实现
- 二叉树的前序、中序、后序遍历 递归非递归实现
- 二叉树的前序、中序、后序(递归、非递归)遍历java实现
- 二叉树的前序,中序,后序遍历(递归非递归实现)
- 实现二叉树的前序/中序/后序递归、非递归遍历
- 二叉树的前序,中序,后序遍历。用递归和非递归实现
- 【二叉树遍历算法】——前/中/后序递归与非递归的实现
- JAVA实现二叉树的前、中、后序遍历(递归与非递归)
- 前,中,后序遍历二叉树 (递归 && 非递归的栈 && 非递归非栈的线索二叉树)
- 二叉树的遍历:前序、中序、后序、层序的非递归实现
- 二叉树的非递归前序,中序,后序遍历的Java实现
- 二叉树的遍历;前序 中序 后序遍历二叉树;递归 非递归实现; 重建二叉树;编程之美重建二叉树
- 用java实现二叉树非递归的前序,中序,后序遍历算法
- 非递归实现二叉树的前序、中序、后序遍历
- [Leetcode] 314. Binary Tree Vertical Order Traversal 解题报告
- linux(1)
- [GNU/Linux] Linux系统调用-线程相关(三):私有数据
- 2017 Multi-University Training Contest 第一场
- 关于Android的Camera使用总结
- 【二叉树】实现二叉树的前序、中序、后序的非递归遍历
- 百钱百鸡
- 安装并使用node.js
- js框架
- 左神面试算法整理--并归求小和
- vue.js几种不同组件(页面)间传值的方式
- @Temporal——指定查询Date格式
- ros机器人操作系统
- poj 1961 Period(kmp)