树和二叉树的递归定义详解

759 阅读3分钟

作者:老九—技术大黍

社交:知乎

公众号:老九学堂(新人有惊喜)

特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系笔者授权

什么是递归?

如果兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子。假如所有兔都不死,那么一年以后可以繁殖多少对对子呢? 我们拿新出生的一对兔子分析一下:第一个月小兔子没有繁殖能力,所以还是一对;两个月后,生下一对小兔子数共有两对;三个月以后老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是三对……依次类推可以列出下表:

image-20210325100121841.png

表中数字1,1,2,3,5,8,13……构成了一个序列。这个数列有个十分明显的特点,那就是相邻两项之和构成下一项: F(n) = F(n - 1) + F(n - 2),其中F(1) = 1,F(2) = 1。 常规的数列迭代方式可以这样实现:

int main()                                                      
{                                                                
    int a[40];                                                  
    a[0] = 0;                                                   
    a[1] = 1;                                                   
    printf("%d",a[0]);                                         
    printf("%d",a[1]);                                         
    for(int i = 2;i <= 12;i++)                                
    {                                                            
        a[i] = a[i-1]+a[i-2];                                  
        printf("%d",a[i]);                                     
    } 
    return 0;                                                   
} 
还有另一种实现方式:
int Fbi( int i )
{
    if( i < 2 )
         return i == 0 ? 0 : 1;
return Fbi(i - 1) + Fbi(i - 2);
}
int main()                                                      
{                                                                
    for(int i = 0;i <= 12;i++)                                 
        printf("%d",Fbi(i));                                   
    return 0;                                                   
}

定义:我们把这样一个直接调用自己或通过一系列的调用语句间接地调用自己地函数,称为递归函数。

树的递归定义

定义:树(Tree)是n(n≥0)个结点的有限集。n=0时称为空树。在任意一棵非空树中:(1)有且仅有一个特定的称为根(Root)的结点;(2)当n>1时,其余结点可分为m(m > 0)个互不相交的有限集T_1、T_2、……、T_m ,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。

我们把这种在树的定义之中还用到了树的概念的新的定义方式,称为递归定义。

二叉树的递归定义

定义:二叉树(Binary Tree)是n(n≥0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根节点和两棵互不相交的、分别称为根节点的左子树和右子树的二叉树组成。

二叉树的定义之中同样也用到了二叉树来定义,因此它的定义方式也是递归定义。在构建二叉树的时候,根据它的定义方式,我们就能明确的知道它的实现方式——递归

void createBinaryTree(TNode * node)
{    
    if( !root ) return;
    /*按照树结构输入数据*/
    char input[NAME_SIZE];
    gets(input);
    /*输入回车结束当前子树创建*/
    if( strcmp(input,"\0") == 0 ) return;
    /*创建当前结点*/
    strcpy(root->data.name,input);
    id++;
    root->data.id = id;
    root->left = (TNode*)malloc(sizeof(TNode));
    root->right = (TNode*)malloc(sizeof(TNode));
            /*递归创建左子树*/
            printf("input left:");
            createBinaryTree(root->left);
            /*递归创建右子树*/
            printf("input right:");
    createBinaryTree(root->right);
}

总结

这种兔纸、乌龟搅脑壳的事情,网上也有很多,我们在这里发表自己对树和递归的见解,希望能够给大家带来帮助。如果有不足之处,请大家指正和补充。

最后

如果大家觉得有用,请记得给大黍❤️关注+点赞+收藏+评论+转发❤️

作者:老九学堂—技术大黍

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。