树(二叉树遍历的递归法实现 用大白话理清逻辑关系)

        上一篇介绍了有关树的基本概念,以及二叉树的前序、中序、后序及层次遍历这几种遍历方法。这一篇将主要介绍几种遍历用递归方法实现的代码逻辑。

        需要说明一下,这篇里的遍历指的是按照遍历的方法输出二叉树,至于怎么输入会在后续的文章里讲到,之所以“本末倒置”是因为输入涉及到二叉树遍历的应用,难度更大一点,所以还是循序渐进的,先讲简单的递归输出二叉树

用递归函数实现二叉树的遍历

定义结构体

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,按这个方法层层遍历,最终得到整个二叉树的后序遍历。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值