【数据结构】二叉树的创建和遍历(先序、中序、后序)

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

最近一段时间学习了数据结构中二叉树的基本操作,包括二叉树的结构、二叉树的创建、递归先序中序后序遍历、非递归遍历等,想着把二叉树的相关知识和自己的见解放到网上来让网友看看是否正确,想和网友一起共同交流。

先了解一下二叉树的三个基本性质:

性质1:在非空二叉树中,第i层上至多有2i-1个结点(i≧1)。

性质2深度为k的二叉树至多有2k-1个结点(k≧1) 。

性质3对任何一棵二叉树,若其叶子结点数为n0,度为2的结点数为n2,则n0=n2+1。

二叉树的存储也是有两种方式:顺序存储和链式存储。

这里给出链式存储的定义:包括一个数据域、一个左孩子、一个右孩子。

typedef int TElemType;
typedef struct BiTNode{
	TElemType data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

 要创建一个二叉树,可以通过先序遍历创建二叉树的方法:

大体过程为:

  1. 输入根结点,判断是否为-1(空),若为-1,则二叉树为空,否则不为空。
  2. 为其动态内存分配空间,输入左子节点,因为是先序遍历创建,要遵循根、左、右的顺序,所以对左子节点再递归调用该函数直到NULL。
  3. 再输入右子节点,同理,用相同的方法对右子节点递归调用该函数直到NULL。

代码如下:

void createBiTree(BiTree *t)
{
	//先序遍历创建二叉树 
	int e;
	scanf("%d",&e);
	if(e==-1)
		*t=NULL;//二叉树为空
	else
	{
		*t=(BiTree)malloc(sizeof(BiTNode));//动态内存分配
		(*t)->data=e;
		printf("请输入%d的左子节点的值:",e);
		createBiTree(&(*t)->lchild);
		printf("请输入%d的右子节点的值:",e);
		createBiTree(&(*t)->rchild);
	}
}

 创建好一个二叉树后,就要对他进行遍历。

先序遍历:

递归: 若二叉树为空,则遍历结束;否则

⑴ 访问根结点;⑵ 先序遍历左子树(递归调用本算法);⑶ 先序遍历右子树(递归调用本算法)。

非递归:若二叉树为空,则返回;否则,令p=T;⑴ 访问p所指向的结点;⑵ q=p->Rchild ,若q不为空,则q进栈;⑶ p=p->Lchild ,若p不为空,转(1),否则转(4);⑷  退栈到p ,转(1),直到栈空为止。

中序遍历:

递归:若二叉树为空,则遍历结束;否则⑴ 中序遍历左子树(递归调用本算法);⑵ 访问根结点;⑶ 中序遍历右子树(递归调用本算法)。

非递归:

若二叉树为空,则返回;否则,令p=T⑴ 若p不为空,p进栈, p=p->Lchild ;⑵ 否则(即p为空),退栈到p,访问p所指向的结点;⑶ p=p->Rchild ,转(1);直到栈空为止。

后序遍历:

递归:  若二叉树为空,则遍历结束;否则⑴ 后序遍历左子树(递归调用本算法);⑵ 后序遍历右子树(递归调用本算法) ;⑶ 访问根结点 。

非递归:若二叉树为空,则返回;否则,令p=T;⑴ 第一次经过根结点p,不访问;p进栈S1 , tag 赋值0,进栈S2,p=p->Lchild 。⑵ 若p不为空,转(1),否则,取状态标志值tag : ⑶ 若tag=0:对栈S1,不访问,不出栈;修改S2栈顶元素值(tag赋值1) ,取S1栈顶元素的右子树,即p=S1[top]->Rchild ,转(1);⑷ 若tag=1:S1退栈,访问该结点;

直到栈空为止。

递归先序遍历的代码如下:

void PreOrderTraverse(BiTree t)
{
	//递归先序遍历 
	if(t!=NULL)
	{
		printf("%d",t->data);
		PreOrderTraverse(t->lchild);
		PreOrderTraverse(t->rchild);
	}
}

 递归中序遍历的代码如下:

void InOrderTraverse(BiTree t)
{
	//递归中序遍历 
	if(t!=NULL)
	{
		InOrderTraverse(t->lchild);
		printf("%d",t->data);
		InOrderTraverse(t->rchild);
	}
}

递归后序遍历的代码如下:

void PostOrderTraverse(BiTree t)
{
	//递归后序遍历
	if(t!=NULL)
	{
		PostOrderTraverse(t->lchild);
		PostOrderTraverse(t->rchild);
		printf("%d",t->data);
	} 
}

 整体过程就是这样,要想实际测试,完整代码如下:

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 200
typedef int TElemType;
typedef struct BiTNode{
	TElemType data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void createBiTree(BiTree *t)
{
	//先序遍历创建二叉树 
	int e;
	scanf("%d",&e);
	if(e==-1)
		*t=NULL;
	else
	{
		*t=(BiTree)malloc(sizeof(BiTNode));
		(*t)->data=e;
		printf("请输入%d的左子节点的值:",e);
		createBiTree(&(*t)->lchild);
		printf("请输入%d的右子节点的值:",e);
		createBiTree(&(*t)->rchild);
	}
}
void PreOrderTraverse(BiTree t)
{
	//递归先序遍历 
	if(t!=NULL)
	{
		printf("%d",t->data);
		PreOrderTraverse(t->lchild);
		PreOrderTraverse(t->rchild);
	}
}
void InOrderTraverse(BiTree t)
{
	//递归中序遍历 
	if(t!=NULL)
	{
		InOrderTraverse(t->lchild);
		printf("%d",t->data);
		InOrderTraverse(t->rchild);
	}
}
void PostOrderTraverse(BiTree t)
{
	//递归后序遍历
	if(t!=NULL)
	{
		PostOrderTraverse(t->lchild);
		PostOrderTraverse(t->rchild);
		printf("%d",t->data);
	} 
}
void aPreOrderTraverse(BiTree t)
{
	//非递归先序遍历
	BiTree stack[MAXSIZE];
	int top=0;
	if(t==NULL)
		return;
	BiTree p=t;
	while(!(p==NULL&&top==0))
	{
		while(p)
		{
			printf("%d",p->data);//先访问根结点 
			stack[top]=p;//将p入栈 
			top++;
			p=p->lchild;//p指向左孩子 
		}
		if(top<=0)return;
		else
		{
			top--;
			p=stack[top];
			p=p->rchild;//p指向右孩子 
		}	
	} 
}
int main()
{
	BiTree t;
	printf("请输入根节点的值:");
	createBiTree(&t);
	printf("递归先序遍历二叉树为:");
	PreOrderTraverse(t);
	printf("\n");
	printf("递归中序遍历二叉树为:");
	InOrderTraverse(t);
	printf("\n");
	printf("递归后序遍历二叉树为:");
	PostOrderTraverse(t);
	printf("\n"); 
	printf("非递归先序遍历二叉树为:");
	aPreOrderTraverse(t);
	printf("\n");
}

测试结果如下:

测试的二叉树为:

二叉树的创建与遍历,从文件读取数据建立二叉树,进行该树的先根、后根和中根递归与,数据结构,数据结构,算法

 结果为:

二叉树的创建与遍历,从文件读取数据建立二叉树,进行该树的先根、后根和中根递归与,数据结构,数据结构,算法

如果有不正确或者能够更好的地方,欢迎大家多多指教!文章来源地址https://www.toymoban.com/news/detail-761548.html

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

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

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

相关文章

  • 数据结构 | 二叉树的各种遍历

    我们本章来实现二叉树的这些功能 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)
  • 【数据结构】二叉树的层序遍历

    当我们面对一个树结构时,常常需要对其进行遍历以获取其中的节点信息。其中一种常用的遍历方式是层序遍历,也称为广度优先搜索(BFS)。本篇博客将详细介绍层序遍历的原理和实现方法。 层序遍历以树的根节点开始,按照从上到下、从左到右的顺序逐层遍历树中的节点

    2024年02月03日
    浏览(45)
  • 【C语言 数据结构】二叉树的遍历

    所谓先序遍历二叉树,指的是从根结点出发,按照以下步骤访问二叉树的每个结点: 访问当前结点; 进入当前结点的左子树,以同样的步骤遍历左子树中的结点; 遍历完当前结点的左子树后,再进入它的右子树,以同样的步骤遍历右子树中的结点; 先序遍历这棵二叉树的过

    2024年02月04日
    浏览(45)
  • 【数据结构】二叉树的遍历递归算法详解

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

    2024年01月20日
    浏览(45)
  • 【数据结构】二叉树的链式实现及遍历

    后文所有代码中的二叉树结点: 前,中,后序遍历都可以采用分治递归的思想解决,将根节点和它的孩子结点分别处理。 此处仅利用递归展开图分析前序遍历,中序和后序也是相同的思想: 层序遍历需要利用队列来进行,如果二叉树跟结点不为空,则让 指向它的一个指针入

    2024年02月07日
    浏览(50)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包