二叉树的4种遍历:前序,中序,后序,层次遍历
2013-09-07 17:41
260 查看
二叉树的4种遍历方法:前序遍历,中序遍历,后序遍历,层次遍历
看遍历的方法之前,先看下二叉树类的声明:
class ctree
{
public:
//此处为了简化,使用了共有数据
//数据类型使用了char,若想写成通用的类,可以使用template < class T>声明模板类
char treevalue;
ctree *childleft,*childright;
ctree();
};
二叉树是递归结构,每一个节点都有对应的值以及左右子节点,也就是说,对于二叉树节点的访问,其实只需要3步即可:访问根节点,访问左子节点(左子树),访问右子节点(右子树)。
根据访问节点的顺序不同,于是产生了3中不同的访问方法,那就是:前序遍历,中序遍历,后序遍历。
下面是3种方法的实现,主要是使用递归函数实现()
前序遍历:
void preorderoutput(ctree *tree)
{
if (NULL != tree)
{
cout << tree->treevalue << " ";
preorderoutput(tree->childleft);
preorderoutput(tree->childright);
}
}
中序遍历:
void inorderoutput(ctree *tree)
{
if (NULL != tree)
{
inorderoutput(tree->childleft);
cout << tree->treevalue << " ";
inorderoutput(tree->childright);
}
}
后序遍历:
void postorderoutput(ctree *tree)
{
if (NULL != tree)
{
postorderoutput(tree->childleft);
postorderoutput(tree->childright);
cout << tree->treevalue << " ";
}
}
以上是3种递归调用的遍历方法,但是有时候也是需要根据二叉树的层次来遍历的。
层次遍历:
void levelorderoutput(ctree *tree)
{
//将当前能够访问到但是未访问的节点存到队列中,其实存的就是当前节点的子节点
queue<ctree*> treequeue;
ctree *ptree;
treequeue.push(tree);
while (!treequeue.empty())
{
//访问当前节点
ptree = treequeue.front();
//将访问过的节点删除
treequeue.pop();
cout << ptree->treevalue << " ";
//如果存在左子节点,将左子节点插入队列中
if (NULL != ptree->childleft)
{
treequeue.push(ptree->childleft);
}
//如果存在右子节点,将右子结点插入队列中
if (NULL != ptree->childright)
{
treequeue.push(ptree->childright);
}
}
}
本文出自 “adwen2010” 博客,请务必保留此出处http://adwen2010.blog.51cto.com/1820717/1290649
看遍历的方法之前,先看下二叉树类的声明:
class ctree
{
public:
//此处为了简化,使用了共有数据
//数据类型使用了char,若想写成通用的类,可以使用template < class T>声明模板类
char treevalue;
ctree *childleft,*childright;
ctree();
};
二叉树是递归结构,每一个节点都有对应的值以及左右子节点,也就是说,对于二叉树节点的访问,其实只需要3步即可:访问根节点,访问左子节点(左子树),访问右子节点(右子树)。
根据访问节点的顺序不同,于是产生了3中不同的访问方法,那就是:前序遍历,中序遍历,后序遍历。
下面是3种方法的实现,主要是使用递归函数实现()
前序遍历:
void preorderoutput(ctree *tree)
{
if (NULL != tree)
{
cout << tree->treevalue << " ";
preorderoutput(tree->childleft);
preorderoutput(tree->childright);
}
}
中序遍历:
void inorderoutput(ctree *tree)
{
if (NULL != tree)
{
inorderoutput(tree->childleft);
cout << tree->treevalue << " ";
inorderoutput(tree->childright);
}
}
后序遍历:
void postorderoutput(ctree *tree)
{
if (NULL != tree)
{
postorderoutput(tree->childleft);
postorderoutput(tree->childright);
cout << tree->treevalue << " ";
}
}
以上是3种递归调用的遍历方法,但是有时候也是需要根据二叉树的层次来遍历的。
层次遍历:
void levelorderoutput(ctree *tree)
{
//将当前能够访问到但是未访问的节点存到队列中,其实存的就是当前节点的子节点
queue<ctree*> treequeue;
ctree *ptree;
treequeue.push(tree);
while (!treequeue.empty())
{
//访问当前节点
ptree = treequeue.front();
//将访问过的节点删除
treequeue.pop();
cout << ptree->treevalue << " ";
//如果存在左子节点,将左子节点插入队列中
if (NULL != ptree->childleft)
{
treequeue.push(ptree->childleft);
}
//如果存在右子节点,将右子结点插入队列中
if (NULL != ptree->childright)
{
treequeue.push(ptree->childright);
}
}
}
本文出自 “adwen2010” 博客,请务必保留此出处http://adwen2010.blog.51cto.com/1820717/1290649
相关文章推荐
- 二叉树的4种遍历方式(前序、中序、后序、层次)Java版
- 二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 二叉树的前中后层次遍历(递归+非递归)、创建树(数组、前序+中序、中序加后序)
- 二叉树的创建、二叉排序树、前序、中序、后序、层次遍历
- 二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 数据结构 ——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 数据结构--java实现二叉树的先序、中序、后序、层次遍历及根据先序中序建立二叉树
- 二叉树2:层次遍历方式及先序、中序、后序(递归与非递归)遍历方式
- JAVA版二叉树的先序、中序、后序和层次遍历
- 采用二叉链表结构实现二叉树,并以递归遍历思想实现二叉树的创建、二叉树的遍历(先序、中序、后序和层次遍历)
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 二叉树的前序、中序、后序遍历的非递归算法及层次遍历算法
- [置顶] 数据结构之 二叉树的构造与遍历(先序,中序,后序,层次)
- 二叉树的先序,中序,后序,层次,递归,非递归遍历
- 先序,中序,后序,层次遍历二叉树
- 二叉树 的先序 中序、后序遍历、层次遍历以及树状打印等操作
- 二叉树中结构体的应用,以及先序,中序,后序,层次遍历的输出
- 二叉树的遍历(前序、中序、后序、层次)
- python实现二叉树的建立以及遍历(递归前序、中序、后序遍历,队栈前序、中序、后序、层次遍历)