[数据结构]二叉树的建立与遍历(递归)

一、二叉树的遍历与建立

首先我们拥有如下二叉树:

要了解二叉树遍历,我们得先了解二叉树的三种遍历方式:前序遍历,中序遍历,后序遍历

1.前序遍历

前序遍历:根,左子树,右子树

遍历的结果就是:1 2 4 8 N N 9 N N 5 10 N N 11 N N 3 6 N N 7 N N

2.中序遍历

中序遍历:左子树 根 右子树

遍历的结果:N 8 N 4 N 9 N 2 N 10 N 5 N 11 N N 6 N 5 N 7 N

3.后序遍历

后续遍历:左子树 右子树 根

遍历的结果:N N 8 N N 9 4 N N 10 N N 11 5 2 N N 6 N N 7 3 1

注意:N是NULL(即不存在次节点)

4.手撕一棵二叉树

那么我们如何用代码实现这样的遍历并打印,我们先可以写一个二叉树

typedef struct BinTreeNode
{
	struct BinTreeNode* left;
	struct BinTreeNode* right;
	int val;
}BTNode;

然后我们创建相应的节点:

BTNode* BuyBTNode(int val)
{
	BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return NULL;
	}
	newnode->val = val;
	newnode->left = NULL;
	newnode->right = NULL;
	return newnode;
}

然后我们手撕一棵二叉树

BTNode* CreateTree()
{
	BTNode* n1 = BuyBTNode(1);
	BTNode* n2 = BuyBTNode(2);
	BTNode* n3 = BuyBTNode(3);
	BTNode* n4 = BuyBTNode(4);
	BTNode* n5 = BuyBTNode(5);
	BTNode* n6 = BuyBTNode(6);

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

	return n1;
}

这样们就创建好一个二叉树了,接下来我们来写如何遍历吧!

5.用函数来完成遍历

1)前序遍历:

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

	printf("%d ", root->val);
	PreOrder(root->left);
	PreOrder(root->right);
}

按照 根 左子树 右子树 打印如果不为空就继续递归 打印根数据 然后 左子树 最后 右子树 如果为空就打印N然后返回

2)中序遍历

按照 左子树 根 右子树 大体思路如上

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

	InOrder(root->left);
	printf("%d ", root->val);
	InOrder(root->right);
}

3)后序遍历

按照:左子树 右子树 根

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

	PostOrder(root->left);
	PostOrder(root->right);
	printf("%d ", root->val);
}

下面我们来进行一下测试:

首先二叉树如图,我们不然得到

前序遍历:1 2 3 N N N 4 5 N N 6 N N

中序遍历:N 3 N 2 N 1 N 5 N 4 N 6 N

后序遍历:N N 3 N 2 N N 5 N N 6 4 2

我们把上面的代码整合一下

#include<stdio.h>
#include<stdlib.h>
typedef struct BinTreeNode
{
	struct BinTreeNode* left;
	struct BinTreeNode* right;
	int val;
}BTNode;
BTNode* BuyBTNode(int val)
{
	BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return NULL;
	}
	newnode->val = val;
	newnode->left = NULL;
	newnode->right = NULL;
	return newnode;
}
BTNode* CreateTree()
{
	BTNode* n1 = BuyBTNode(1);
	BTNode* n2 = BuyBTNode(2);
	BTNode* n3 = BuyBTNode(3);
	BTNode* n4 = BuyBTNode(4);
	BTNode* n5 = BuyBTNode(5);
	BTNode* n6 = BuyBTNode(6);

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

	return n1;
}
void PreOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}

	printf("%d ", root->val);
	PreOrder(root->left);
	PreOrder(root->right);
}

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

	InOrder(root->left);
	printf("%d ", root->val);
	InOrder(root->right);
}
void PostOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}

	PostOrder(root->left);
	PostOrder(root->right);
	printf("%d ", root->val);
}



int main()
{
	BTNode* root = CreateTree();
	printf("前序遍历:");
	PreOrder(root);
	printf("\n");

	printf("中序遍历:");
	InOrder(root);
	printf("\n");

	printf("后序遍历:");
	PostOrder(root);
	printf("\n");

	return 0;
}

运行结果:

我们发现结果与我们预期的一致,所以我们完成了二叉树的遍历

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/485932.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

爆增49.07%!2024国自然面上项目申报,再创新高

毕业推荐 SSCI&#xff08;ABS一星&#xff09; • 社科类&#xff0c;3.0-4.0&#xff0c;JCR2区&#xff0c;中科院3区 • 13天录用&#xff0c;28天见刊&#xff0c;13天检索 SCIE&#xff1a; • 计算机类&#xff0c;6.5-7.0&#xff0c;JCR1区&#xff0c;中科院2区…

大东方保险集团陈志远:洞察保险行业的重要性及未来三年发展前景

在当今社会,保险行业作为风险管理的重要工具,正日益凸显其不可或缺的地位。大东方保险集团陈志远近日在接受采访时,深入探讨了保险行业的重要性以及未来三年的发展前景。 一、保险行业的重要性 陈志远指出,保险行业在现代经济中扮演着举足轻重的角色。它不仅是社会稳定的“减震…

Spring自定义注解防重提交方案(参数形式Token令牌)

防重提交通常在需要防止用户重复提交表单或执行某些敏感操作时使用&#xff0c;以确保系统的数据一致性和安全性&#xff0c;本文章集结了通用场景下防重提交&#xff08;参数形式&Token令牌&#xff09;&#xff0c;采用Java的特性&#xff08;注解和AOP&#xff09;&…

后端如何返回404地址

当我们网站输入不存在的地址&#xff0c;经常会出现404的页面&#xff0c;这是如何做到的 1.添加配置 spring:mvc:view:prefix: /templates/suffix: .html 2.resources下添加templates目录&#xff0c;下面放404的网站 3.添加依赖&#xff0c;版本在主pom里面配置好了&#x…

Memcached非关系型数据库介绍

使用背景 Memcached 不是一个数据库&#xff0c;而是一个高性能的分布式内存对象缓存系统。它主要用于减轻数据库负载&#xff0c;提高动态Web应用的速度、可扩展性和性能。Memcached 的工作原理是将数据存储在内存中&#xff0c;以提供快速的数据访问。当应用程序需要访问数据…

夸克、迅雷网盘项目拉新推广去哪对接?推荐几个一手项目渠道!

在进行夸克、迅雷网盘等项目的拉新推广时&#xff0c;对接合适的渠道和平台是至关重要的。本文将分享几个地推、网推一手渠道&#xff0c;帮助您轻松开展拉新推广项目。 1.任推邦 国内知名项目拉新平台&#xff0c;这个平台对接的项目大多是官方直签&#xff0c;截至目前已经…

Facebook账号防封的有效方法附解禁方法

Facebook作为跨境主要业务平台&#xff0c;一直以来封号率都非常高。相信点进来的各位或多或少地遇见了个人号被封&#xff0c;广告账户被禁&#xff0c;FB主页被封等情况。针对此类问题&#xff0c;今天就小编也来分享自己的Facebook防封经验。 一、Facebook被封原因 主要有以…

【电能管理】安科瑞AEM碳排放功能表/电碳表/碳结算/三相嵌入式电表/尖峰平谷峰谷分时/最大需量/二部制电价/节能降碳/CE认证

什么是电碳表!!! 电碳表是一种计量设备&#xff0c;可以帮助用户了解和控制电力使用中的碳排放。原理是根据实际电力系统的计量数据&#xff0c;动态计算并更新电碳因子&#xff08;平均每度电所蕴含的碳排放量&#xff09;&#xff0c;并且这个数据是实时更新的&#xff0c;真…

【云效测试管理】测试用例、测试计划(用例执行)、缺陷管理、测试报告全流程管理

背景 我们公司之前使用过很多测试管理软件&#xff0c;从最开始原始的Excel来管理缺陷&#xff0c;再到Worktitle管理缺陷&#xff0c;再到现在的云效&#xff1b;用例管理管理在本地。 再后来我们转用云效流水线来部署测试环境&#xff0c;开始尝试发掘云效中的“测试管理”…

泛型可空类型Nullable<T>

.Net Framework 4.8版本开始&#xff0c;引入了可空类型Nullable<T>. 对于引用类型的变量来说&#xff0c;如果未赋值&#xff0c;默认情况下是 Null 值&#xff0c; 对于值类型的变量&#xff0c;如果未赋值&#xff0c;整型变量的默认值为 0,Boolean默认为false&…

项目2-用户登录

1.创建项目 2.引入前端代码并检查是否有误 3.定义接口 需求分析 对于后端开发⼈员⽽⾔, 不涉及前端⻚⾯的展⽰, 只需要提供两个功能 1. 登录⻚⾯: 通过账号和密码, 校验输⼊的账号密码是否正确, 并告知前端 2. ⾸⻚: 告知前端当前登录⽤⼾. 如果当前已有⽤⼾登录, 返回登录的账…

【算法与数据结构】总结

目录 引言 一、线性数据结构 1. 1 数组&#xff08;Array&#xff09; 1.2 链表&#xff08;Linked List&#xff09; 1.3 栈&#xff08;Stack&#xff09; 1.4 队列&#xff08;Queue&#xff09; 二、图形数据结构 2.1 深度优先搜索&#xff08;DFS&#xff09;&…

机器学习之线性回归与逻辑回归【完整房价预测和鸢尾花分类代码解释】

目录 前言 一、什么是线性回归 二、什么是逻辑回归 三、基于Python 和 Scikit-learn 库实现线性回归 示例代码&#xff1a; 使用线性回归来预测房价: 四、基于Python 和 Scikit-learn 库实现逻辑回归 五、总结 线性回归的优缺点总结&#xff1a; 逻辑回归&#xff08;Logistic…

数字孪生技术在健康医疗的应用

数字孪生技术在健康医疗领域的应用前景广阔&#xff0c;它通过创建物理实体或工作过程的虚拟版本&#xff0c;为医疗健康领域带来了革命性的变化。以下是数字孪生在医疗健康领域的一些关键应用&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件…

[深度学习]yolov8+pyqt5搭建精美界面GUI设计源码实现一

【简单介绍】 基于YOLOv8与PyQt5的精美界面GUI设计&#xff0c;旨在为用户提供一个直观、易用且功能强大的目标检测平台。通过结合YOLOv8的先进目标检测能力与PyQt5的丰富界面设计元素&#xff0c;我们打造了一款高效、稳定的软件产品。 在界面设计上&#xff0c;我们注重用户…

R语言在气象、水文中数据处理及结果分析、绘图实践技术应用

R 语言是一门由统计学家开发的用于统计计算和作图的语言&#xff08;a Statistic Language developed for Statistic by Statistician&#xff09;&#xff0c;由 S 语言发展而来&#xff0c;以统计分析功能见长。R 软件是一款集成 了数据操作、统计和可视化功能的优秀的开源软…

Java中的代理模式(动态代理和静态代理)

代理模式 我们先了解一下代理模式&#xff1a; 在开发中&#xff0c;当我们要访问目标类时&#xff0c;不是直接访问目标类&#xff0c;而是访问器代理类。通过代理类调用目标类完成操作。简单来说就是&#xff1a;把直接访问变为间接访问。 这样做的最大好处就是&#xff1a…

C++第十一弹---类与对象(八)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、友元 1.1、友元函数 1.2、友元类 2、内部类 3、匿名对象 4、拷贝对象时的一些编译器优化 总结 1、友元 友元提供了一种突破封装的方式&a…

最新Java面试题5【2024初级】

互联网大厂面试题 1&#xff1a;阿里巴巴Java面试题 2&#xff1a;阿里云Java面试题-实习生岗 3&#xff1a;腾讯Java面试题-高级 4&#xff1a;字节跳动Java面试题 5&#xff1a;字节跳动Java面试题-大数据方向 6&#xff1a;百度Java面试题 7&#xff1a;蚂蚁金服Java…

由浅到深认识Java语言(26):阶段性练习

该文章Github地址&#xff1a;https://github.com/AntonyCheng/java-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.c…