二叉树的4种遍历:前序,中序,后序,层次遍历

二叉树的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);

       }

   }

}


你可能感兴趣的:(二叉树的4种遍历)