前序遍历递归
void PreOrder(pTreeT root)
{
if (NULL != root)
{
visit(root);
PreOrder(root->left);
PreOrder(root->right);
}
}
前序遍历非递归
void PreOrderNoRec(pTreeT root)
{
stack<treeT *> s;
while ((NULL != root) || !s.empty())
{
if (NULL != root)
{
visit(root);
s.push(root);
root = root->left;
}
else
{
root = s.top();
s.pop();
root = root->right;
}
}
}
中序遍历递归
void InOrder(pTreeT root)
{
if (NULL != root)
{
BT_InOrder(root->left);
visit(root);
BT_InOrder(root->right);
}
}
中序遍历非递归
void InOrderNoRec(pTreeT root)
{
stack<treeT *> s;
while ((NULL != root) || !s.empty())
{
if (NULL != root)
{
s.push(root);
root = root->left;
}
else
{
root = s.top();
visit(root);
s.pop();
root = root->right;
}
}
后序遍历递归
void PostOrder(pTreeT root)
{
if (NULL != root)
{
BT_PostOrder(root->left);
BT_PostOrder(root->right);
visit(root);
}
}
后序遍历非递归
利用pre记录最近访问的结点
void postOrder(TreeNode<T> *root)
{
stack<TreeNode<T>*> st;//定义栈,节点类型为TreeNode
TreeNode<T> *p = root;
TreeNode<T> *pre = NULL;//pre表示最近一次访问的结点
while(p || st.size()!=0)
{
//沿着左孩子方向走到最左下 。
while(p)
{
st.push(p);
p = p->left;
}
//get the top element of the stack
p = st.top();
//如果p没有右孩子或者其右孩子刚刚被访问过
if(p->right == NULL || p->right == pre)
{
//visit this element and then pop it
cout << "visit: " << p->data << endl;
st.pop();
pre = p;
p = NULL;
}
else
{
p = p->right;
}
}//end of while(p || st.size()!=0)
}
分别来自:
http://www.cppblog.com/ngaut/archive/2012/09/06/2351.html
http://blog.csdn.net/iamyina/article/details/4124613
分享到:
相关推荐
本文将深入探讨二叉树的前序、中序、后序遍历的递归和非递归算法。 1. **前序遍历**: - **递归算法**:首先访问根节点,然后递归地对左子树进行前序遍历,最后对右子树进行前序遍历。伪代码如下: ``` function...
### 二叉树先序、中序、后序遍历非递归算法 #### 前言 在计算机科学中,二叉树是一种常见的数据结构,它被广泛应用于各种算法和程序设计中。二叉树的遍历是理解并操作二叉树的基础,通常有三种主要的遍历方式:...
数据结构二叉树链式结构的前序遍历,中序遍历,后序遍历用递归的方法,层级遍历采用队列结构
标题"关于二叉树前序和后序的非递归遍历算法"指的是不使用递归函数来实现二叉树的前序和后序遍历。递归方法虽然直观,但在处理大型二叉树时可能会导致栈溢出,因此非递归方法是一个更优的选择。 **前序遍历**是...
这里我们将重点讨论如何在已知二叉树的前序和中序遍历的情况下,通过非递归算法实现后序遍历。 **前序遍历**:根节点 -> 左子树 -> 右子树 **中序遍历**:左子树 -> 根节点 -> 右子树 **后序遍历**:左子树 -> 右子...
本主题将详细介绍如何非递归地进行二叉树的前序、中序和后序遍历,以及如何使用C语言实现通用栈结构来辅助遍历。 首先,我们来看递归遍历的方法。递归遍历是基于函数调用自身来完成的,对于二叉树,有以下三种遍历...
本篇文章将深入探讨二叉树的建立以及前序、中序和后序遍历的方法。 首先,我们要理解如何建立一个二叉树。二叉树的构建通常通过递归或迭代两种方式实现。递归方法是基于树的分治思想,将大问题分解为小问题来解决。...
以上算法展示了如何利用栈进行二叉树的前序、中序和后序非递归遍历。这些非递归方法不仅避免了递归可能带来的栈溢出问题,而且在处理大规模数据时更有效率。理解并掌握这些算法,对于深入学习数据结构和算法优化具有...
关于数据结构实验的二叉树问题
二叉树前序,中序,后序,求深度的递归和非递归方法
本程序实现了三种主要的二叉树遍历方法:先序遍历、中序遍历和后序遍历。以下是关于这些遍历方法的详细解释: 1. 先序遍历(Preorder Traversal): - 访问根节点。 - 对左子树进行先序遍历。 - 对右子树进行...
在二叉树遍历中,我们创建一个迭代器对象,它可以按照特定的顺序(前序、中序或后序)遍历树的节点。迭代器模式让客户端代码可以方便地遍历整个树,而无需了解节点的内部结构或者遍历的具体逻辑。 **前序遍历**是...
### 二叉树的前序、中序、后序遍历 #### 一、引言 在计算机科学中,二叉树是一种常见的数据结构,它由节点组成,每个节点最多有两个子节点,分别称为左子节点和右子节点。为了有效地处理和操作二叉树中的数据,通常...
二叉树遍历是计算机科学中一种重要的数据结构操作,主要应用于树形数据结构的处理。在软考中,理解并能熟练应用二叉树的遍历方法是必不可少的技能。这里我们详细讨论前序遍历、中序遍历、后序遍历以及层次遍历这四种...
(1)建立的二叉树; 节点的结构体为: typedef struct ...(2)完成二叉树前序、中序、后序非递归遍历程序;从上至下,从左向右层次遍历;从上至下,从右向左层次遍历; (3)给出程序和每种遍历程序的结果。
根据提供的标题、描述以及部分代码内容,我们可以总结出关于二叉树非递归遍历算法的相关知识点。 ### 一、二叉树非递归遍历算法概述 在数据结构的学习中,二叉树是非常重要的一个概念,而遍历是访问二叉树节点的一...
本文主要讨论了二叉树的前序、中序、后序遍历的非递归(迭代)实现,并提供了一个统一的模板。在了解非递归实现之前,我们先回顾一下递归实现的思路。 递归实现非常直观,三种遍历的递归代码几乎相同,只是访问子...
以上介绍了二叉树前序、中序和后序遍历的非递归实现。通过使用栈,这些算法避免了递归带来的潜在问题,如栈溢出,同时保持了良好的空间和时间效率。理解并掌握这些非递归遍历算法,对于深入学习数据结构和算法设计...
常见的遍历方法包括:前序遍历、中序遍历和后序遍历。 #### 4.1 前序遍历 前序遍历的顺序是先访问根节点,然后递归地进行左子树的前序遍历,最后递归地进行右子树的前序遍历。实现代码如下: ```c void Preoder...
文件"非递归前序,中序,后序遍历二叉树(优化算法)"可能包含具体的代码实现和解释,而"www.pudn.com.txt"可能是提供资料的链接或相关讨论。学习和实践这些算法,能够提高对二叉树操作的理解和处理能力。