首页 > 其他分享 >数据结构 ——— 链式二叉树的前中后序遍历递归实现

数据结构 ——— 链式二叉树的前中后序遍历递归实现

时间:2024-11-04 10:16:34浏览次数:3  
标签:左子 遍历 后序 BTNode 二叉树 链式 root

目录

前言

链式二叉树示意图​编辑

手搓一个链式二叉树

链式二叉树的前序遍历

链式二叉树的中序遍历

链式二叉树的后序遍历 


前言

在上一章学习了链式二叉树的前中后序遍历的解析

数据结构 ——— 链式二叉树的前中后序遍历解析-CSDN博客

接下来要学习的是代码实现链式二叉树的前中后序遍历访问


链式二叉树示意图


手搓一个链式二叉树

代码演示:

// 数据类型
typedef int BTDataType;

// 二叉树节点的结构
typedef struct BinaryTreeNode
{
	BTDataType data; //每个节点的数据

	struct BinaryTreeNode* left; //指向左子树的指针

	struct BinaryTreeNode* right; //指向右子树的指针
}BTNode;

// 申请新节点
BTNode* BuyNode(BTDataType x)
{
	BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));

	// 判断是否申请成功
	if (newnode == NULL)
	{
		perror("malloc fail");
		return NULL;
	}

	// 初始化
	newnode->data = x;
	newnode->left = NULL;
	newnode->right = NULL;

	return newnode;
}

BTNode* CreatBinaryTree()
{
	BTNode* n1 = BuyNode(1);
	assert(n1);
	BTNode* n2 = BuyNode(2);
	assert(n2);
	BTNode* n3 = BuyNode(3);
	assert(n3);
	BTNode* n4 = BuyNode(4);
	assert(n4);
	BTNode* n5 = BuyNode(5);
	assert(n5);
	BTNode* n6 = BuyNode(6);
	assert(n6);

	n1->left = n2;
	n1->right = n4;
	n2->left = n3;
	n4->left = n5;
	n4->right = n6;

	return n1;
}

先构建二叉树每个节点的结构,再手动添加并修改指向,以上面的示意图为例


链式二叉树的前序遍历

前序遍历访问顺序:根 -> 左子树 -> 右子树

代码演示:

void PrevOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return ;
	}

	// 根 -> 左子树 -> 右子树
	printf("%d ", root->data);
	PrevOrder(root->left);
	PrevOrder(root->right);
}

代码解析:

不论左右子树,当 root 走到 NULL 时就返回
否则就根据前序遍历的顺序再利用递归结构进行遍历

大致走读代码:

因为是前序遍历,所以先打印根的数据
再利用递归传递根的左子树,把传递的左子树节点再次当作根节点打印
再利用递归传递当前根的左子树,直到左子树为空时就返回
但是不是完全结束函数,而是返回上一层,传递当前根的右子树………………

代码验证:


链式二叉树的中序遍历

中序遍历访问顺序:左子树 -> 根 -> 右子树

代码演示:

void MiddleOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}

	// 左子树 -> 根 -> 右子树
	MiddleOrder(root->left);
	printf("%d ", root->data);
	MiddleOrder(root->right);
}

代码解析:

代码的逻辑类似于前序递归遍历,不同的是要根据中序遍历的访问顺序进行遍历

代码验证:


链式二叉树的后序遍历

后序遍历访问顺序:左子树 -> 右子树 -> 根

代码演示:

void AfterOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}

	// 左子树 -> 右子树 -> 根
	AfterOrder(root->left);
	AfterOrder(root->right);
	printf("%d ", root->data);
}

代码解析:

过程类似前中序一样,根据后续的遍历访问顺序进行访问

代码验证:

标签:左子,遍历,后序,BTNode,二叉树,链式,root
From: https://blog.csdn.net/weixin_55341642/article/details/143469277

相关文章

  • 【数据结构】二叉树——堆
    一、二叉树的概念与结构二叉树的概念二叉树是树的一种,二叉树的特殊之处在于,每个根节点都可以有两个子节点,可以两个子节点都为空,或者一个为空,一个不为空,或者两个都有数,在构建二叉树的节点时就可以看出:现实中的二叉树:就像这颗树,每次分叉都分出两个枝条,这就是一个二叉树......
  • 二叉树进阶-二叉搜索树
    目录1.二叉树的概念2.二叉搜索树的操作2.1二叉搜索树的结构2.2实现节点的查找(find)2.3实现增加节点(insert)2.4实现删除节点(erase)2.5析构函数2.6二叉搜索树的完整实现3.二叉搜索树的应用3.1K模型3.2KV模型4.二叉搜索树的性能分析1.二叉树的概念二叉搜索树也叫二......
  • 代码随想录算法训练营第十五天|leetcode110. 平衡二叉树、leetcode257.二叉树的所有路
    1leetcode110.平衡二叉树题目链接:110.平衡二叉树-力扣(LeetCode)文章链接:代码随想录视频链接:后序遍历求高度,高度判断是否平衡|LeetCode:110.平衡二叉树_哔哩哔哩_bilibili1.1视频看后的思路1.1.1完整的代码就是不断判断,对其数据存储,其实突然发现每道题思路真的都很像,就......
  • C++——二叉树(进阶)
    1.二叉搜索树1.1概念二叉搜索树又称二叉排序树,它或是一棵空树,又或是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二......
  • 动态动态规划 & 全局平衡二叉树 小记
    估计这几天是正式学习ddp,所以特写笔记。DDP简介是这样一类技巧,利用广义的矩阵乘法实现单点修改权值,动态查询某个点的DP值关于矩阵乘法,广义矩阵乘法其核心思想是利用矩阵乘法具有结合律(可以使用数据结构维护)的优势序列上的Ddp先看一个例子:最大子段和,显然我们有\(f_......
  • 遍历文件夹和子文件夹,删除重复文件
    importosimporthashlibimportshutildeffile_hash(filepath):"""计算文件的MD5哈希值"""hash_md5=hashlib.md5()withopen(filepath,"rb")asf:forchunkiniter(lambda:f.read(4096),b""):......
  • 【数据结构】二叉树链式结构的实现
    1.前置说明    在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。由于现在大家对二叉树结构掌握还不够深入,为了降低大家学习成本,此处手动快速创建一棵简单的二叉树,快速进入二叉树操作学习,等二叉树结构了解的差不多时,我们反过头再来研究......
  • JAVA 二叉树面试题
    @目录摘要代码Node节点main函数问题1:递归——求二叉树的最大深度问题2:求二叉树的最小深度问题3:求二叉树中节点的个数问题4:求二叉树中叶子节点的个数问题5:求二叉树中第k层节点的个数,不是求第k层叶子节点个数问题6:判断两棵树是否相同问题7:给定一个二叉树,检查它是否是镜像对称的。问......
  • 数据结构与算法(二叉树)
    鲸饮未吞海,剑气已横秋。 前言  这是我学习数据结构的第五份笔记,有关二叉树的知识。后期我会继续将数据结构知识的笔记补全。 上一期笔记有栈与列队,没看过的同学可以去看看:有关栈与列队的笔记https://blog.csdn.net/hsy1603914691/article/details/143064674?spm=10......