非递归实现二叉树的遍历(前序、中序、后序)
来源:互联网 发布:java list 字符串排序 编辑:程序博客网 时间:2024/05/22 18:05
树的定义本是递归定义,所以采用递归的方法实现遍历算法,更加让人理解,且代码简单方便。若采用非递归的方法实现,须得利用栈模拟实现。
栈的特点(后进先出)
非递归实现二叉树的前序遍历:
原理如图所示:
参考代码如下:
void _PrevOrder(Node* root)//非递归实现前序遍历
{
stack<Node*> s;
if(root == NULL)
return;
s.push(root);
while (!s.empty())
{
root = s.top();
cout<<root->_data<<" ";
s.pop();
if (root->_right)
{
s.push(root->_right);
}
if(root->_left)
{
s.push(root->_left);
}
}
}
非递归实现二叉树的中序遍历
原理:
先从二叉树的最左边进行遍历(1、2、3),且一边遍历,一边入栈,当当到达结点3时,因为3的左右子树都为空,此时需弹出结点3,栈顶元素变为2,再遍历2的右子树的左结点,因为4的左右子树都为空,此时需弹出2,压人4,左子树已遍历结束,弹出4,再弹出1,依照遍历左子树,遍历右子树。
参考代码如下:
void _InOrder(Node* root)//非递归实现中序遍历
{
stack<Node*> s;
Node* cur = root;
while (cur || !s.empty())
{
while (cur)
{
s.push(cur);
cur = cur->_left;
}
Node* top = s.top();
cout<<top->_data<<" ";
s.pop();
cur = top->_right;
}
}
非递归实现二叉树的后序遍历
步骤:
1、借助栈实现后序遍历,先找到最左边且为最下边的结点3(一边找,一边入栈)
2、若3没有右子树,则弹出3且打印结点3,还需要引入一个指向当前弹出结点的指针prev
3、若3有右子树,则需要遍历右子树,遍历结束才可以打印并弹出结点3,重复此三步骤可完成后序遍历。
参考代码如下:
void _PosOrder(Node* root)//非递归实现后序遍历
{
Node* cur = root;
Node* prev = NULL;
stack<Node*> s;
if(root == NULL)
return;
while (cur || !s.empty())
{
while (cur)
{
s.push(cur);
cur = cur->_left;
}
cur = s.top();
if(cur->_right == NULL || cur->_right == prev)
{
cout<<cur->_data<<" ";
s.pop();
prev = cur;
cur = NULL;
}
else
{
cur = cur->_right;
}
}
}
本文出自 “缘去即成幻” 博客,请务必保留此出处http://liu153.blog.51cto.com/10820414/1767023
- 二叉树的前序、中序、后序(递归、非递归)遍历java实现
- JAVA实现二叉树的前、中、后序遍历(递归与非递归)
- 二叉树非递归前、中、后序遍历实现
- 非递归实现二叉树的后序遍历、前序遍历、中序遍历
- 二叉树的非递归【前/中/后 序遍历】
- 非递归实现二叉树的遍历(前序、中序、后序)
- Java实现二叉树的前序、中序、后序遍历(非递归方法)
- 二叉树 前序遍历的非递归实现 中序遍历的非递归实现 后序遍历的非递归实现 创建二叉树
- C++实现二叉树的非递归遍历(层,前,中,后序)
- 【二叉树】实现二叉树的前序、中序、后序的非递归遍历
- 二叉树的前序、中序、后序遍历 递归非递归实现
- 二叉树的前序,中序,后序遍历(递归非递归实现)
- 实现二叉树的前序/中序/后序递归、非递归遍历
- 二叉树的前序,中序,后序遍历。用递归和非递归实现
- 【二叉树遍历算法】——前/中/后序递归与非递归的实现
- 二叉树的遍历:前序、中序、后序、层序的非递归实现
- 二叉树的前序、中序、后序的递归与非递归遍历算法实现(待完善)
- 二叉树的非递归前序,中序,后序遍历的Java实现
- 利用C语言实现动态顺序表
- C语言实现单链表的基本操作及其部分面试题
- 迷宫问题
- 二叉树的简单实现及其部分面试题
- 复杂链表的复制
- 非递归实现二叉树的遍历(前序、中序、后序)
- 有关字符串中的函数及其部分面试题
- vim(linux编辑器)的使用
- 用VIM浏览源代码之跳转到函数/数据类型/变量的定义处
- vim的简单配置
- ctags的简单配置及其使用
- linux中make命令的简单使用以及Makefile文件的书写
- 进程间通信之管道
- linux下信号量及其SEM_UNDO标志