您的位置:首页 > 其它

二叉树的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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐