以下就是一个简单二叉树
以下是一个理解递归函数形象的案例
假设你住在一个奇妙的迷宫中,迷宫中有很多房间,每个房间都有一扇门。你的任务是找到一条从起始房间到达目标房间的路径。每个房间都有一张地图,上面标有相邻房间的编号。
可以使用递归函数来解决这个问题。来看一个示例代码:
#include <stdio.h>
void findPath(int currentRoom, int targetRoom) {
printf("你正在房间 %d\n", currentRoom);
// 如果当前房间是目标房间,则找到了路径,结束递归
if (currentRoom == targetRoom) {
printf("找到了从房间 %d 到房间 %d 的路径!\n", currentRoom, targetRoom);
return;
}
// 根据地图找到下一个房间,并递归调用自身
int nextRoom = getNextRoom(currentRoom); // 获取下一个房间的编号
findPath(nextRoom, targetRoom); // 递归调用自身,继续寻找路径
}
int getNextRoom(int currentRoom) {
// 根据当前房间的地图,返回下一个房间的编号
// 这里可以是一些逻辑判断和计算
// 假设当前房间编号加1就是下一个房间
return currentRoom + 1;
}
int main() {
int startRoom = 1; // 起始房间编号
int targetRoom = 5; // 目标房间编号
printf("开始寻找从房间 %d 到房间 %d 的路径...\n", startRoom, targetRoom);
findPath(startRoom, targetRoom);
return 0;
}
解释:
使用递归函数 findPath
来寻找从起始房间到目标房间的路径。函数的参数包括当前房间编号和目标房间编号。
函数首先打印当前所在的房间编号。然后,它检查当前房间是否是目标房间,如果是,则打印找到路径的消息并返回。如果不是目标房间,它调用 getNextRoom
函数获取下一个房间的编号,并递归调用自身,将下一个房间作为当前房间继续寻找路径。
getNextRoom
函数根据当前房间的地图逻辑,返回下一个房间的编号。在这个例子中,假设下一个房间的编号是当前房间编号加1。
在 main
函数中,你设置起始房间和目标房间的编号,并调用 findPath
函数开始寻找路径。
运行程序,你将看到递归函数的执行过程,它会逐步打印你所在的房间编号,直到找到目标房间并打印找到路径的消息。
迷宫问题帮助理解递归函数的工作原理:通过不断地调用自身来解决相同类型的子问题,直到达到终止条件。
#include<stdio.h>
#include<stdlib.h>
//构建结构体
typedef struct TreeNode{
int data;
struct TreeNode* left;
struct TreeNode* right;
}TreeNode;
//创建节点
TreeNode* createTreeNode(int newData){
TreeNode *newNode = (TreeNode*)malloc(sizeof(TreeNode));
if(newNode==NULL){
printf("分配内存失败,请保证电脑内存不为满的状态\n");
return NULL;
}
newNode->data=newData;
newNode->left=NULL;
newNode->right=NULL;
return newNode;
}
//前序遍历
void QianXu(TreeNode *p){
if(p==NULL){
return;
}
printf(" %d",p->data); //根
QianXu(p->left); //左
QianXu(p->right);//右
}
//中序遍历
void ZhongXu(TreeNode *p){
if(p==NULL){
return;
}
ZhongXu(p->left);//左
printf(" %d",p->data);//根
ZhongXu(p->right);//右
}
//后序遍历
void HouXu(TreeNode *p){
if(p==NULL){
return;
}
HouXu(p->left);//左
HouXu(p->right);//右
printf(" %d",p->data);//根
}
//主函数
int main(){
TreeNode* p=createTreeNode(1);
p->left=createTreeNode(2);
p->right=createTreeNode(3);
p->left->left=createTreeNode(4);
p->left->right=createTreeNode(5);
p->right->left = createTreeNode(6);
p->right->right = createTreeNode(7);
//前序遍历
printf("前序遍历开始:");
QianXu(p);
printf("\n");
//中序遍历
printf("中序遍历开始:");
ZhongXu(p);
printf("\n");
//后序遍历
printf("后序遍历开始:");
HouXu(p);
printf("\n");
}