上一篇介绍了有关树的基本概念,以及二叉树的前序、中序、后序及层次遍历这几种遍历方法。这一篇将主要介绍几种遍历用递归方法实现的代码逻辑。
需要说明一下,这篇里的遍历指的是按照遍历的方法输出二叉树,至于怎么输入会在后续的文章里讲到,之所以“本末倒置”是因为输入涉及到二叉树遍历的应用,难度更大一点,所以还是循序渐进的,先讲简单的递归输出二叉树。
用递归函数实现二叉树的遍历
定义结构体
struct BiNode{
char data;
BiNode *lchild,*rchild;
};
typedef BiNode *BiTree;
构造空二叉树
int InitBiTree(BiTree &T)
{
T=NULL;
return 0;
}
按前序遍历输出二叉树
int PreTraverse(BiTree T)
{
if(T==NULL)
return 0;
cout << T->data;
PreTraverse(T->lchild);
PreTraverse(T->rchild);
return 0;
}
在上一篇文章中学习到前序遍历的规则是:根结点-左子结点-右子结点。
递归函数的写法是先判断根结点是否为空,如果非空就将其输出,接着遍历它的左子结点,若非空则输出,再遍历左子结点的左子结点,直到最后一个左子结点x,它没有左子就会返回0;接着遍历最后一个左子结点的右子若非空则输出若为空则返回为0;至此PreTraverse(x)函数运行结束,接着运行和x同一层的右子结点y的PreTraverse(y),输出规则类比x,再运行它们父结点同一层的右子结点,按照这个方法层层遍历,最终得到整个树的前序遍历输出。
按中序遍历输出二叉树
中序遍历的规则是:左子结点-根结点-右子结点。
int InTraverse(BiTree T)
{
if(T == NULL)
return 0;
InTraverse(T->lchild);
cout << T->data;
InTraverse(T->rchild);
return 0;
}
递归函数的写法是先判断根结点是否为空,如果非空就遍历该结点的左子结点,直到最后一个左子结点x的左子为空返回0,接着输出x的值;再将x的右子树a传入递归函数,先遍历a的左子树,遍历完x的右子树a,InTraverse(x)函数运行结束(左子结束) ,接着输出x的父结点(根),再运行和x同一层的右子y(右子),InTraverse(y),按这个方法层层遍历,最终得到整个树的中序遍历输出。
按后序遍历输出二叉树
后序遍历的规则是:左子结点-右子结点-根结点
int SucTraverse(BiTree T)
{
if(T == NULL)
return 0;
SucTraverse(T->lchild);
SucTraverse(T->rchild);
cout << T->data;
return 0;
}
递归函数的写法类比前序和中序,先判断根结点是否为空,再遍历左子树到最后一个左子结点x,若x存在右子,按照后序遍历规则再遍历x的右子树,最后输出x,按这个方法层层遍历,最终得到整个二叉树的后序遍历。