当前位置: 首页 > news >正文

数据结构初阶:二叉树的前中后序三种遍历(递归的暴力美学)

想要实现二叉树的遍历可以创建一个链式结构的二叉树

回顾一下二叉树的概念,二叉树分为空树和非空二叉树,非空二叉树由根节点、根节点的左子树和根节点的右子树组成。

typedef char BTDataType;          // 数据类型
typedef struct BinaryTreeNode
{
	BTDataType data;
	struct BinaryTreeNode* left;  // 二叉树的左节点
	struct BinaryTreeNode* right; // 二叉树的右节点
}BTNode;

前中后序遍历

1)前序遍历(Preorder Traversal 亦称先序遍历):访问根结点的操作发⽣在遍历其左右⼦树之前

访问顺序为:根结点、左⼦树、右⼦树

A- > B -> D -> NULL -> NULL -> NULL -> C -> E -> NULL -> NULL -> F -> NULL -> NULL


2)中序遍历(Inorder Traversal):访问根结点的操作发⽣在遍历其左右⼦树之中(间)

访问顺序为:左⼦树、根结点、右⼦树

NULL -> D -> NULL -> B -> NULL -> A -> NULL -> E -> NULL -> C -> NULL -> F -> NULL

3)后序遍历(Postorder Traversal):访问根结点的操作发⽣在遍历其左右⼦树之后

访问顺序为:左⼦树、右⼦树、根结点

NULL -> NULL -> D -> NULL -> B -> NULL -> NULL -> E -> NULL -> NULL -> F -> C -> A

创建节点

BTNode* ByeNode(BTDataType x)
{
	BTNode* root = (BTNode*)malloc(sizeof(BTNode));
	if (root == NULL)
	{
		perror("malloc fail!");
		exit(1);
	}
	root->data = x;
	root->left = root->right = NULL;
	return root;
}

BTNode* createBinaryTree()
{
	BTNode* rootA = ByeNode('A');
	BTNode* rootB = ByeNode('B');
	BTNode* rootC = ByeNode('C');
	BTNode* rootD = ByeNode('D');
	BTNode* rootE = ByeNode('E');
	BTNode* rootF = ByeNode('F');

	rootA->left = rootB;
	rootA->right = rootC;
	rootB->left = rootD;
	rootC->left = rootE;
	rootC->right = rootF;

	return rootA;
}

代码实现前序遍历

// 先序遍历二叉树——根左右
void preOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	printf("%c ", root->data);
	preOrder(root->left);
	preOrder(root->right);
}

画了一个简易的递归图,原图过长且太小了

中序遍历代码

// 中序遍历二叉树——左根右
void inOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	inOrder(root->left);
	printf("%c ", root->data);
	inOrder(root->right);
}

后序遍历代码

//后序遍历二叉树——左右根
void postOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	postOrder(root->left);
	postOrder(root->right);
	printf("%c ", root->data);
}

http://www.dtcms.com/a/107911.html

相关文章:

  • 3D意识(3D Awareness)浅析
  • 【Spring Boot 与 Spring Cloud 深度 Mape 之一】剖析 Spring Boot 核心:从快速构建到自动配置原理与实战
  • 零基础 LangGraph 多智能体开发
  • 使用mysqldump进行远程mysql本地定时备份
  • 模板模式——设计模式
  • 记一个.NET AOT交叉编译时的坑
  • 18认识Qt坐标系
  • 青少年编程与数学 02-015 大学数学知识点 01课题、概要
  • 【28BYJ-48】STM32同时驱动4个步进电机,支持调速与正反转
  • vue3二次封装ElDatePicker
  • Vue 组件命名及子组件接收参数命名
  • 汇编学习之《call, return指令》
  • 【前端安全】模板字符串动态拼接HTML的防XSS完全指南
  • 安装IIS 10
  • QML输入控件: RangeSlider的基础用法与样式
  • Flutter中实现中国省份地图
  • dom操作笔记、xml和document等
  • C语言学习笔记
  • 如何平衡元器件成本与性能
  • Day19 -实例:xcx逆向提取+微信开发者工具动态调试+bp动态抓包对小程序进行资产收集
  • React-Markdown详解
  • 解决大小写、保留字与特殊字符问题!Oracle双引号在SQL中的特殊应用
  • 论文阅读笔记:Denoising Diffusion Implicit Models (4)
  • PyTorch 激活函数
  • PyQt5和OpenCV车牌识别系统
  • Java基础 4.2
  • Mysql 在什么样的情况下会产生死锁?
  • Python爬虫第2节-网页基础和爬虫基本原理
  • 2.Linux的权限理解
  • mysql docker容器启动遇到的问题整理