初次见识递归
以前写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);
}
}