直观的展示二叉树三种遍历方式和C语言实现

文章目录

  • 绪论
  • 一、核心知识
    • 1、递归函数
    • 2、二叉树的遍历核心
  • 二、代码

绪论

以下就是一个简单二叉树
直观的展示二叉树三种遍历方式和C语言实现_第1张图片

一、核心知识

1、递归函数

以下是一个理解递归函数形象的案例
假设你住在一个奇妙的迷宫中,迷宫中有很多房间,每个房间都有一扇门。你的任务是找到一条从起始房间到达目标房间的路径。每个房间都有一张地图,上面标有相邻房间的编号。

可以使用递归函数来解决这个问题。来看一个示例代码:

#include 

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 函数开始寻找路径。

运行程序,你将看到递归函数的执行过程,它会逐步打印你所在的房间编号,直到找到目标房间并打印找到路径的消息。

迷宫问题帮助理解递归函数的工作原理:通过不断地调用自身来解决相同类型的子问题,直到达到终止条件。

2、二叉树的遍历核心

  • 前序遍历,访问节点顺序:根节点—>左子节点—>右子节点(根节点在最前面被访问)
  • 中序遍历,访问节点顺序:左子节点—>根节点—>右子节点(根节点在最中间被访问)
  • 后续遍历,访问节点顺序:左子节点—>右子节点—>根节点(根节点在最后面被访问)

二、代码

#include
#include
//构建结构体 
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");
} 

你可能感兴趣的:(c语言,算法,数据结构)