【数据结构】二叉树的遍历递归算法详解

这篇具有很好参考价值的文章主要介绍了【数据结构】二叉树的遍历递归算法详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

💫二叉树的结点结构定义

typedef struct BinaryTreeNode
{
	int val;
	struct BinaryNode* left;
	struct BinaryNode* right;
}BTNode;

💫创建一个二叉树结点

我们来写一个函数BuyNode(x)函数用于创建二叉树结点。
用动态开辟函数malloc函数进行动态开辟,并强制转换为BTNode型,用变量node来去管理开辟的空间。
我们初始化结点,其val即为传入的参数x,左右指针leftright都设为NULL。

//创建一个二叉树结点
BTNode* BuyNode(int x)
{
	BTNode* node = (BTNode*)malloc(sizeof(BTNode));
	if (node == NULL)
	{
		perror("malloc fail");
	}
	else
	{
		node->val = x;
		node->left = NULL;
		node->right = NULL;
	}
}

💫在主函数中手动创建一颗二叉树

二叉树递归遍历算法,数据结构与算法,算法,数据结构
我们在主函数中创建上面这样一颗二叉树。
首先,我们需要开辟6个结点,但此时6个结点之间没有任何的联系,我们需要改变其中一些结点的指针域left和right,来使得结点之间产生联系。

int main()
{
	BTNode* node1 = BuyNode(1);
	BTNode* node2 = BuyNode(2);
	BTNode* node3 = BuyNode(3);
	BTNode* node4 = BuyNode(4);
	BTNode* node5 = BuyNode(5);
	BTNode* node6 = BuyNode(6);
	node1->left = node2;
	node1->right = node4;
	node1->right=node3;
	node2->left = node4;
	node3->left = node5;
	node3->right = node6;

	return 0;
}

💫二叉树的前序遍历

首先,我们先要了解以下二叉树前序的前序遍历。
二叉树的前序遍历:
根-->左子树-->右子树
对于我们上面的这颗二叉树:
二叉树递归遍历算法,数据结构与算法,算法,数据结构

1-->左-->

左子树和右子树也采用前序遍历的方式:
二叉树递归遍历算法,数据结构与算法,算法,数据结构

左子树:

2-->4

右子树

3-->5-->6

所以这颗二叉树的前序遍历为:

1-->2-->4-->3-->5-->6

正是由于这样的思想,将一个树根-->左-->右仍然是一颗树,接着再拆分…直到左子树和右子树的左右结点为空时。
所以这样的思想,我们就利用递归的想法就可以完成一颗二叉树的遍历。

💫调用栈递归——实现前序遍历

调用栈:程序在执行时,如果程序调用一个函数,它会先把这个函数压入栈中,等到这个函数返回结果(return )后,它才会从栈中弹出。
递归程序在执行时,会不断地调用自身,把函数压入栈中,当最后一个函数,也就是基线条件出现时,再逐渐清空栈空间。

下面我们根据这段代码来画图理解一些递归的思想。

//递归前序遍历一棵树
void PreOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL");
		return;
	}
	printf("%d", root->val);
	PreOrder(root->left);
	PreOrder(root->right);
	return 0;
}

二叉树递归遍历算法,数据结构与算法,算法,数据结构
我们按照步骤来执行以下程序:
主函数中进行了函数调用,参数为node1
压栈:
二叉树递归遍历算法,数据结构与算法,算法,数据结构
node1不为空,打印结点:
二叉树递归遍历算法,数据结构与算法,算法,数据结构
执行PreOrder(root->left),再次调用函数,参数为node2
进行压栈:
二叉树递归遍历算法,数据结构与算法,算法,数据结构
node2不为空,打印
二叉树递归遍历算法,数据结构与算法,算法,数据结构
执行PreOrder(root->left),再次调用函数,参数为node4,压栈:
二叉树递归遍历算法,数据结构与算法,算法,数据结构
node4不为空,打印:
二叉树递归遍历算法,数据结构与算法,算法,数据结构
执行PreOrder(root->left),再次调用函数,参数为NULL,压栈:
二叉树递归遍历算法,数据结构与算法,算法,数据结构
这是函数参数为NULL,进入if语句,进行打印 ,并return返回,这时出栈
二叉树递归遍历算法,数据结构与算法,算法,数据结构
二叉树递归遍历算法,数据结构与算法,算法,数据结构
二叉树递归遍历算法,数据结构与算法,算法,数据结构
y由于这段代码,当函数的参数为node4时,PreOrder(node4->left)已经有return,所以这时,程序会接着往下面执行PreOrder(node4->right)二叉树递归遍历算法,数据结构与算法,算法,数据结构
这时再次调用函数,函数参数为NULL,压栈,打印,再出栈。
二叉树递归遍历算法,数据结构与算法,算法,数据结构
二叉树递归遍历算法,数据结构与算法,算法,数据结构
二叉树递归遍历算法,数据结构与算法,算法,数据结构

这时对于函数PreOrder (node4)已经执行完语句 PreOrder(node4->left)和语句PreOrder(node4->right)了,后执行 return 0,函数有返回结果,所以出栈
二叉树递归遍历算法,数据结构与算法,算法,数据结构
二叉树递归遍历算法,数据结构与算法,算法,数据结构
此时,我们该执行 node2的右结点了。
对于PreOrder(node2->right)中,函数函数即是NULL,所以先压栈,然后打印,然后出栈。
二叉树递归遍历算法,数据结构与算法,算法,数据结构

二叉树递归遍历算法,数据结构与算法,算法,数据结构

二叉树递归遍历算法,数据结构与算法,算法,数据结构
二叉树递归遍历算法,数据结构与算法,算法,数据结构
⑧此时,函数PreOrder(node2)PreOrder(node2->left)PreOrder(node2->right) 都已经执行完了,即已经对node2结点的左右子树遍历完成,执行return 0 返回,这时PreOrder(node2) 出栈。
二叉树递归遍历算法,数据结构与算法,算法,数据结构
二叉树递归遍历算法,数据结构与算法,算法,数据结构
在此时,我们已经对node1的左子树遍历完成,接下来同遍历左子树一样,我们对右子树进行遍历。
二叉树递归遍历算法,数据结构与算法,算法,数据结构
二叉树递归遍历算法,数据结构与算法,算法,数据结构
二叉树递归遍历算法,数据结构与算法,算法,数据结构
二叉树递归遍历算法,数据结构与算法,算法,数据结构
这时输出为:
二叉树递归遍历算法,数据结构与算法,算法,数据结构

💫递归实现中序和后序遍历

根据上面前序的递归,我觉得最重要的代码是:

	if (root == NULL)
	{
		printf("NULL");
		return;
	}

它是递归中能否回溯的一个关键。
下面写中序遍历

//递归中序遍历二叉树
void Order(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	Order(root->left);
	printf("%d ", root->val);
	Order(root->right);

	return 0;
}

递归后序遍历一棵树:

//递归后序遍历一颗二叉树
void PostOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	PostOrder(root->left);
	PostOrder(root->right);
	printf("%d ", root->val);
	return 0;
}

前中后序遍历结果分别为:
二叉树递归遍历算法,数据结构与算法,算法,数据结构文章来源地址https://www.toymoban.com/news/detail-807993.html

到了这里,关于【数据结构】二叉树的遍历递归算法详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法与数据结构】二叉树的三种遍历代码实现(上)—— 用递归序知识点讲解

      本篇博客 (上篇) 先带大家学习 递归方式 进行三种遍历, 而在后续的 (下篇) 中将为大家详细讲解非递归的三种遍历方式。 目录 1、二叉树 2、二叉树的递归遍历 2.1、先序遍历 2.2、中序遍历 2.3、后序遍历  二叉树(Binary tree)是树形结构的一个重要类型。许多实际问

    2024年02月08日
    浏览(44)
  • 数据结构与算法学习:二叉树的后序遍历的递归与非递归实现,以及非递归实现中的流程控制的说明。

    需求二叉树: 采用二叉树后序遍历非递归算法。设置一个指针p初始指向树根,p先入栈,而后使得p指向它的左孩子p-firstchild,重复操作,使得每个左孩子都依次入栈,同时初始化一个Treenode*类型的指针 pre,这个指针是后序前驱,这个后序前驱用以区分为已访问过的结点和未

    2023年04月22日
    浏览(49)
  • 【数据结构】二叉树(遍历,递归)

     🌈个人主页: 秦jh__https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343 🔥 系列专栏: 《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm=1001.2014.3001.5482 ​​​ 目录 二叉树遍历规则 前序遍历 ​ 中序遍历  后序遍历 递归结构遍历 前序 中序  求节点个数 求叶子节点个数  求树

    2024年01月19日
    浏览(41)
  • 【数据结构】二叉树的遍历

      Yan-英杰的主页 悟已往之不谏 知来者之可追    C++程序员,2024届电子信息研究生 目录 前序、中序以及后序遍历 前序遍历 中序遍历 后序遍历                  学习二叉树结构,最简单的方式就是遍历。所谓 二叉树遍历 (Traversal) 是按照某种特定的规则,依次对二叉

    2023年04月23日
    浏览(45)
  • 数据结构 | 二叉树的各种遍历

    我们本章来实现二叉树的这些功能 Tree.h 我们先来几个简单的 直接手动个创建即可,很简单~~ 这里也是很简单,也可以看做下图这样遍历,或者画一下递归展开图 我们这里看一下递归展开图 为空就返回0 不是空,是叶子,返回1 不是空,也不是叶子,就递归左子树和右子树

    2024年02月04日
    浏览(39)
  • go数据结构(二叉树的遍历)

      用数组来存储二叉树如何遍历的呢? 如果父节点的数组下表是i,那么它的左孩子就是i * 2 + 1,右孩子就是 i * 2 + 2。  二叉树的遍历方式: 二叉树有 三种基本遍历方式 ,分别是 前序遍历、中序遍历和后序遍历 。遍历的原理是从根节点开始,按照特定方式递归遍历左子树

    2023年04月15日
    浏览(40)
  • Java数据结构——二叉树的遍历

     作者:敲代码の流川枫 博客主页:流川枫的博客 专栏:和我一起学java 语录:Stay hungry stay foolish 工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器——牛客网 点击注册和我一起刷题 文章目录 1.创建二叉树 2.二叉树的三种遍历方式 3.代码实现遍历 前序遍历

    2024年01月22日
    浏览(48)
  • 【数据结构】二叉树的三种遍历

    目录 一、数据结构 二、二叉树 三、如何遍历二叉树 数据结构是计算机科学中用于组织和存储数据的方式。它定义了数据元素之间的关系以及对数据元素的操作。常见的数据结构包括数组、链表、栈、队列、树、图等。 数组是一种线性数据结构,它使用连续的内存空间存储

    2024年02月21日
    浏览(48)
  • 数据结构与算法-二叉树的遍历

    🌞 “少年没有乌托邦,心向远方自明朗!” 二叉树的遍历是按照一定次序访问二叉树中的所有结点,且每个结点仅被访问一次的过程。遍历线性结构是容易解决的,而二叉树的结构是非线性结构,需要寻找规律,使二叉树的结点排列在一个线性队列上,便于遍历。 由二叉树

    2024年02月08日
    浏览(46)
  • 数据结构——二叉树的遍历与应用

    目录 一.前言 二. 二叉树链式结构的实现 2.1 前置说明 2.2 二叉树的遍历 2.2.1 前序、中序以及后序遍历 前序遍历: 中序遍历递归图: 后序遍历: 2.3节点个数 2.4叶子节点个数 2.5第K层的节点个数 2.6 二叉树查找值为x的节点 2.7 二叉树的销毁 三.结语   大家好久不见,放寒假了咱

    2024年01月19日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包