递归的偶然发现

初次见识递归

以前写C的时候可能也用到递归,那时候只是简单地认识到递归就是自己调用自己。现在我才发现递归是如此的神奇。

背景

我们知道,在数据结构中,树的遍历是对于初学者来说比较麻烦的一个问题

我一开始的疑惑就是,怎么才能根据规定的顺序一个接一个地去访问,以前学过的链表类的结构体都是一个紧接着一个,只要指针每次指向下一个即可,但是这里的顺序不一样,直到我看到了教材里的代码,才发现递归的神奇之处。

下面是我最近对于树的遍历写的前序遍历、中序遍历和后序遍历。


开始的定义

#define MaxSize 100
// 二叉链表表示方法
typedef struct BiNode
{
    char data[MaxSize];
    // lchild表示左孩子,rchild表示右孩子
    struct BiNode* lchild,rchild;
}BiNode;

前序遍历

// 前序遍历
void PreOrder(BiNode* root)
{
    // 这个if语句既可以判断是否为空树,也可以在某节点没有
    // 子树时结束
    if (root==NULL)
    // return用于退出循环
        return;
    else{
        // 前序遍历需要先输出根,然后再从上往下的输出左子树
        // 所以printf因放在前面
        printf("the data is:%c\n",root->data);
        PreOrder(root->lchild);
        PreOrder(root->rchild);
    }
}

中序遍历

// 中序遍历 
void InOrder(BiNode* root)
{
    if (root==NULL)
        return;
    else{
        // 这里的递归可以一层一层地直接从root到最后
        // 然后先输出递归到的最里层没有左子树的节点(这个节点也是左)
        InOrder(root->lchild);
        printf("the data is:%c\n",root->data);
        // 接上行注释,然后输出这个节点的右子树,再看该树是否有左子树,重复
        InOrder(root->rchild);
    }

}

后序遍历

// 后序遍历
void PostOrder(BiNode* root)
{
    if (root==NULL)
        return;
    else{
        //从某个角度来说第一行代码相当于是优先级最高,
        // 只有完成了第一行代码的递归才会执行第二行的代码
        PostOrder(root->lchild);
        PostOrder(root->rchild);
        printf("%c",root->data); 
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值