【数据结构】二叉树的前中后序遍历(C语言)

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

什么是二叉树

[二叉树] 顾名思义就是有两个分支节点的树,不仅如此,除了叶子外的所有节点都具有两个分支节点;
由于结构像一棵倒立的树,顾名思义为二叉树

【数据结构】二叉树的前中后序遍历(C语言),数据结构,二叉树,数据结构,c语言,开发语言

如下图所示,该图即为一棵野生的二叉树

【数据结构】二叉树的前中后序遍历(C语言),数据结构,二叉树,数据结构,c语言,开发语言

既然二叉树为树,固然有着和树一样的部分(叶子、根、分支…)
这些也成为了树相关的概念;


树相关的概念

  • 叶子节点或者终端节点

叶子节点或终端节点,顾名思义就是最底端的节点,该节点不存在分支,故被称为叶子;

【数据结构】二叉树的前中后序遍历(C语言),数据结构,二叉树,数据结构,c语言,开发语言


  • 节点的度

节点的度即为一个节点含有的子树成为该节点的度,如图所示,节点C的度为3;

【数据结构】二叉树的前中后序遍历(C语言),数据结构,二叉树,数据结构,c语言,开发语言


  • 双亲结点(父节点)

若是一个节点存在子节点则该节点成为该子节点的父节点;如上图所示,A节点既是B的父节点,也是C的父节点;


  • 兄弟节点

具有相同父节点的节点成称为兄弟节点,“双亲结点”中所提到的“A结点既是B的父节点,也是C的父结点”处中的BC节点即为兄弟节点。


  • 树的度

树的度即为一棵树中,最大的节点的度,如“结点的度”中的C节点,该节点为整棵树中度最大的结点为3,故该树的度为3;


  • 树的高度或深度

树中结点的最大层次即为树的高度,如上图所示,树的高度为3;


  • 堂兄弟节点

双亲在同一层的节点互为堂兄弟,如上图所示,E节点和F节点护卫堂兄弟节点;


  • 节点的祖先

从根到节点所经分支上的所有节点,如上图所示,A节点为所有节点的祖先;


  • 子孙

以某节点为根的子树中任意一个节点都称为该节点的子孙
如上图所示,除A以外的所有其他节点都为A节点的子孙;


  • 森林

由m(m>0)棵互不相交的树的集合称为森林;


树的表示形式

树的结构与线性表相比就会更加复杂,既要保存值域,同时也要保存树中节点与节点之间的关系;在树中有许多的表示方法(双亲表示法、孩子表示法、孩子双亲表示法、孩子兄弟表示法等等),在此就不做过多赘述;

既然树的结构如此复杂,那对于真正实际中,树有什么应用呢?大家可以将计算机中的文件夹进行比较,从一个文件夹可以分支出很多个文件夹,文件夹内还可以继续存放文件夹,如此;
在Linux操作系统就应用了文件目录树,目录树的起点是根目录,Linux文件系统中的每一文件在此目录树中的文件名都是独一无二的,因为其包含从根目录开始的完整路径;
同时在很多算法中,都运用到了树;


特殊的二叉树

二叉树在树中也算是一个比较特殊的树种,但在二叉树中也存在着特殊的二叉树,即为完全二叉树与满二叉树

  • 满二叉树
    一个二叉树,如果每一层的节点树都达到最大值,则这个二叉树就是满二叉树;也就是说,如果一个二叉树的层数为k,且节点总数是2^k-1,则它就是满二叉树;
  • 完全二叉树
    完全二叉树是一种效率很高的树,是由满二叉树引申出来的。对于深度为k的,有n个节点的二叉树,当且仅当其每个节点都与深度k的满二叉树中编号从1至n的节点一一对应时称为完全二叉树,同时满二叉树也是一种特殊的完全二叉树。
    【数据结构】二叉树的前中后序遍历(C语言),数据结构,二叉树,数据结构,c语言,开发语言

如何创造出一棵二叉树

在不使用任何算法的前提下若是想得到一棵二叉树可以使用比较简单粗暴的方式:

将各个节点创建并将每个节点连接在一起(该方法适用于任何一种树);

根据树的结构我们可以得知,树既要保存值域,同时也要保存节点之间的关系,又因为为二叉树(每个节点必有两个分支)

假设需要创建一个如图所示的二叉树
【数据结构】二叉树的前中后序遍历(C语言),数据结构,二叉树,数据结构,c语言,开发语言

在此处可以定义一个结构体,并在结构体内存放结构体指针用来存放左右两个子树,同时创建一个成员变量用来存放所需要存储的值域

typedef char BTDataType;
typedef struct BinaryNode
{
	struct BinaryNode*left;
	struct BinaryNode*right;
	BTDataType a;
}BTNode;

根据图所示可知,A节点的子节点为B、C;
B节点的子节点为D、E;
C节点的子节点为F、G;

	int main()
	{
		BTNode q1;
		BTNode q2;
		BTNode q3;
		BTNode q4;
		BTNode q5;
		BTNode q6;
		BTNode q7;
 		
 		q1.a = 'A';
 		q2.a = 'B';
 		q3.a = 'C';
 		q4.a = 'D';
 		q5.a = 'E';
 		q6.a = 'F';
 		q7.a = 'G';

		q1.left = &q2;
		q1.right = &q3;
		q2.left = &q4;
		q2.right = &q5;
		q3.left = &q6;
		q3.right = &q7;
		q4.left = q4.right = q5.left = q5.right =q6.left = q6.right = q7.left = q7.right =NULL;
		
		return 0;
	}

二叉树的遍历

二叉树的遍历分为先序遍历,中序遍历,后序遍历以及层序遍历

为什么会叫先中后,顾名思义,这里的先中后为遍历过程中根节点的访问顺序,一棵树的任意子树都可以看成根节点和子树;
至于层序遍历,即为一层一层的进行访问;

首先设存在一棵二叉树
【数据结构】二叉树的前中后序遍历(C语言),数据结构,二叉树,数据结构,c语言,开发语言

先序遍历(前序遍历)

先序遍历的遍历方式为:根、左子树、右子树
按照该树可以得出,该树的前序遍历为:A,B,D,E,C,F,G

根据根、左子树、右子树的顺序可知,最先访问的必定是A节点,当A节点访问完即访问左子树,而左子树的根节点为B,B访问结束访问B的左子树,为D,D没有左右子树(为空)故返回访问B的右子树,E与D同理,而后B访问结束放回根节点A并访问A的右树,同理得出该树的前序遍历为 A,B,D,E,C,F,G

既然看图可以得出树的前序遍历,那在代码中如何表示出二叉树的前序遍历,该处只需要使用递归的方式,按照根、左、右的方式即可;

void BinaryTreePreOrder(BTNode*root)
{
	if(root==NULL){//当root为空时则表示该处无节点,即无存储有效数据,若是访问则会造成对空指针的非法解引用
		printf("NULL");
		return ;
	}
	printf("%c ",root->a);//若是不为空则打印出该节点内所存储的有效数据
	BinaryTreePreOrder(root->left);//访问该节点的左子树
	BinaryTreePreOrder(root->right);//访问该节点的右子树
}

如图所示
【数据结构】二叉树的前中后序遍历(C语言),数据结构,二叉树,数据结构,c语言,开发语言


中序遍历

中序遍历的遍历顺序为:左子树、根、右子树
按照该树可得出中序遍历的结果为:D,B,E,A,F,C,G;

若是用代码方式表示即为:

void BinaryTreeInOrder(BTNode*root)
{
	if(root==NULL){//当root为空时则表示该处无节点,即无存储有效数据,若是访问则会造成对空指针的非法解引用
		printf("NULL");
		return;
	}
	printf("%c ",root->a);//若是不为空则打印出该节点内所存储的有效数据
	BinaryTreeInOrder(root->left);//访问该节点的左子树
	BinaryTreeInOrder(root->right);//访问该节点的右子树
}

后序遍历

中序遍历的遍历顺序为:左子树、右子树、根
按照该树可得出中序遍历的结果为:D,E,B,F,G,C,A;

若是用代码方式表示即为:

void BinaryTreePostOrder(BTNode*root)
{
	if(root==NULL){//当root为空时则表示该处无节点,即无存储有效数据,若是访问则会造成对空指针的非法解引用
		printf("NULL");
		return;
	}
	BinaryTreePostOrder(root->left);//访问该节点的左子树
	BinaryTreePostOrder(root->right);//访问该节点的右子树
	printf("%c ",root->a);//若是不为空则打印出该节点内所存储的有效数据

}

总结

二叉树除了前中后序遍历以外还有一种遍历方式叫作层序遍历,可以使用队列的FIFO特性从而完成该遍历的实现;
在利用递归实现解决二叉树相关问题的过程中,可以根据实际情况选择相应的遍历方式从而以效率较高的方式解决问题;
所有的二叉树问题都可以将其分为两个子问题进行解决;文章来源地址https://www.toymoban.com/news/detail-581808.html

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

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

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

相关文章

  • 【数据结构】前中后层序遍历 --二叉树的结构特点与遍历方式

      Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。 🌈个人主页:主页链接 🌈算法专栏:专栏链接       我会一直往里填充内容哒! 🌈LeetCode专栏:专栏链接       目前在刷初级算法的LeetBook 。若每日一题当中有力所能

    2023年04月09日
    浏览(84)
  • 【数据结构】二叉树的·深度优先遍历(前中后序遍历)and·广度优先(层序遍历)

    💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃 个人主页 :阿然成长日记 👈点击可跳转 📆 个人专栏: 🔹数据结构与算法🔹C语言进阶 🚩 不能则学,不知则问,耻于问人,决无长进 🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍 (1) 先序遍历 的过

    2024年01月24日
    浏览(45)
  • 【数据结构】二叉树的前序遍历、中序遍历、后序遍历、层序遍历

    文章目录 1.二叉树的概念 1.1概念 1.2存储方式 1.3特殊的二叉树  1.4规律 2.二叉树的实现 2.1表现方式 2.2遍历     2.2.1前序遍历   思想   代码   详细分析      2.2.2中序遍历     2.2.3后序遍历     2.2.4层序遍历   思想   代码   详细过程         一棵二叉树是结点的一

    2024年04月23日
    浏览(38)
  • 14-数据结构-二叉树的创建以及前中后遍历,以及结点和叶子节点的计算(C语言)

    概述:         二叉树,这里采用孩子链表存储法,即一个数据域和两个左右孩子指针域。随后递归进行遍历即可。在创建二叉树的时候,先创建各个二叉树结点(这里的结点采用动态分配,因此结点为指针变量),随后,再根据逻辑结构图,手动通过左右指针域,链接到对

    2024年02月11日
    浏览(45)
  • 初阶数据结构之---二叉树链式结构(二叉树的构建,二叉树的前序,中序,后序和层序遍历,计算二叉树结点个数,第k层结点个数,叶子结点个数,判断是否为完全二叉树)

    本篇博客是初阶数据结构树的收尾,将会讲掉 基本二叉树链式结构的具体内容和实现,包括二叉树的构建,前序遍历,中序遍历,后序遍历和层序遍历,计算二叉树结点个数,第k层结点个数,二叉树叶子结点个数,以及判断一个二叉树是否为完全二叉树 。话不多说,开始我

    2024年03月24日
    浏览(51)
  • 数据结构——二叉树线索化遍历(前中后序遍历)

    为什么要转换为线索化         二叉树线索化是一种将普通二叉树转换为具有特殊线索(指向前驱和后继节点)的二叉树的过程。这种线索化的目的是为了提高对二叉树的遍历效率,特别是在不使用递归或栈的情况下进行遍历。         将二叉树线索化的主要目的是为了

    2024年02月09日
    浏览(39)
  • 【数据结构】树、二叉树的概念和二叉树的顺序结构及实现

    之前我们学习了顺序表、链表以及栈和队列这些数据结构,但这些数据结构都是线性的(一对一)。接下来要学习 非线性的数据结构——树(二叉树) ,相比前面的,树的结构更加复杂,话不多说,直接进入正题吧。 树是一种 非线性的数据结构 ,它是 一对多(也有可能是

    2024年02月07日
    浏览(42)
  • 数据结构——二叉树的链式结构

      个人主页 : 日刷百题 系列专栏 : 〖C语言小游戏〗〖Linux〗〖数据结构〗  〖C语言〗 🌎 欢迎各位 → 点赞 👍+ 收藏 ⭐️+ 留言 📝  ​ 这里我们使用先序遍历的思想来创建二叉树,这里的内容对于刚接触二叉树的朋友可能有些难理解,不妨先看完下面的二叉树各种遍历

    2024年02月05日
    浏览(48)
  • 【数据结构】二叉树的链式结构

    学习链式二叉树要知道三种遍历方式,便于对二叉树的节点以及左子树和右子树进行操作。 前序遍历:根、左子树、右子树 中序遍历:左子树、根、右子树 后序遍历:左子树、右子树、根 以下图为例: 得到的结果: 前序遍历:1 2 3 4 5 6 中序遍历:3 2 1 5 4 6 后序遍历:3 2

    2024年02月08日
    浏览(57)
  • 数据结构:二叉树的链式结构

    朋友们、伙计们,我们又见面了,本期来给大家解读一下链式二叉树的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! 数据结构与算法专栏 :数据结构与算法 个  人  主  页 :stackY、 C 语 言 专 栏 :C语言:从入门到精通 目录 前言

    2024年02月07日
    浏览(59)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包