递归数据结构的定义
![23b2978c07c33b30a0ef50c28940c045.gif](https://img-blog.csdnimg.cn/img_convert/23b2978c07c33b30a0ef50c28940c045.gif)
▼▼▼
采用递归方式定义的数据结构称为递归数据结构。在递归数据结构定义中包含的递归运算称为基本递归运算。
对于二叉树,采用递归数据结构的定义如下:
RD = (D,Op)
其中,D是所有二叉树(含空二叉树)的集合Op= {op1,op2}:
op1(b)=b ->lchild b为含一个或一个以上节点的二叉树op2(b)=b->rchild b为含一个或一个以上节点的二叉树
显然,这两个基本的递归数据结构的运算符都是一元运算符,且具有封闭性。
二叉树的遍历算法设计
![23b2978c07c33b30a0ef50c28940c045.gif](https://img-blog.csdnimg.cn/img_convert/23b2978c07c33b30a0ef50c28940c045.gif)
▼▼▼
二叉树的遍历是指按照一定次序访问树中所有结点,并且每个结点均被访问一次,且仅被访问一次。
由二叉树的递归定义可得:遍历一棵二叉树便要决定对根结点N、左子树L和右子树R的访问顺序。按照先遍历左子树再遍历右子树的原则,常见的遍历次序有先序(NLR)、中序(LNR)、后序(LRN)。
常见的 4中递归遍历方法如下:①先序遍历
②中序遍历
③后序遍历
④层序遍历
1 先序遍历 先序遍历二叉树的过程如下: ➤ 访问根结点; ➤ 先序遍历左子树; ➤ 先序遍历右子树。 ➤先序遍历的递归算 法如下:void PreOrder(BiTree T){
if(T != NULL) {
visit(T); //访问根结点 PreOrder(T->lchild); //先序递归访问左子树 PreOrder(T->rchild); //先序递归访问右子树 }}//提示:先序遍历序列中第一个结点是根结点
➤先序遍历的非递归算
法如下:
void PreOrder(BiTree T){
InitStack(S); p = T; while(p || !StackEmpty(S)) {
if(p) {
visit(p->data); push(S,p); p = p->lchild; } else {