二叉树的实现(前序、中序、后序)(全面)

news2024/11/16 22:19:39

上一篇我们学习的二叉树的理论,知道了什么是二叉树之后,我们来实现一棵二叉树,二叉树经常考的是前中后序的遍历,这里我们多实现一些功能。


1.二叉树功能

二叉树的实现充分利用了分治思想

1.前序遍历

2.中序遍历

3.后序遍历

4.树的最大深度

5.统计树的节点数

6.求树的叶子节点的个数

7.打印这几个叶子结点

8.二叉树查找值为x的节点

9.二叉树第k层节点个数

10.判断这棵二叉树是不是平衡二叉树

2.代码实现

Tree.h文件

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>

typedef char AdataType;
//创建二叉树结构体
typedef struct BinaryTreeNode
{
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
	AdataType data;
}BTNode;
//初始化这棵树
void TreeInit(BTNode* root);
//创建树节点
BTNode* TreeNode(BTNode* root, AdataType x);
//前序遍历
void PrevOrder(BTNode* root);
//中序遍历
void InOrder(BTNode* root);
//后序遍历
void PostOrder(BTNode* root);
//统计这棵树共有几个节点
int TreeSize(BTNode* root);
//销毁树
void Destory2Tree(BTNode* root);
//求一棵树的叶子节点的个数
int TreeLeafSize(BTNode* root);
//求这几个叶子节点
void TreeLeafNode(BTNode* root);
//求这个树的最大深度
int TreeDepth(BTNode* root);
// 二叉树第k层节点个数
int TreeLevelKSize(BTNode* root, int k);
// 二叉树查找值为x的节点
BTNode* BinaryTreeFind(BTNode* root, AdataType x);
//判断这棵树是不是平衡二叉树
bool IsBalanced(BTNode* root);

Tree.c文件

#include"Tree.h"
//初始化这棵树
void TreeInit(BTNode* root)
{
	root->left = root->right = NULL;
	root->data = 0;
}

//创建树节点
BTNode* TreeNode(BTNode* root, AdataType x)
{
	/*assert(root);*/
	root = (BTNode*)malloc(sizeof(BTNode));
	if (root == NULL)
	{
		perror("malloc");
		exit(-1);
	}
	root->data = x;
	root->left = root->right = NULL;
	return root;
}

//前序遍历
void PrevOrder(BTNode* root)
{
	//这里不能断言,当root为空的时候,说明它是空树,是空二叉树
	//assert(root);
	if (root == NULL)
	{
		printf(" NULL ");
		return;
	}
	printf(" %c ", root->data);
	PrevOrder(root->left);
	PrevOrder(root->right);

}
//中序遍历
void InOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf(" NULL ");

		return;
	}
	PrevOrder(root->left);
	printf(" %c ", root->data);
	PrevOrder(root->right);
}
//后序遍历
void PostOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf(" NULL ");
		return;
	}
	PrevOrder(root->left);
	PrevOrder(root->right);
	printf(" %c ", root->data);
}
//统计这棵树共有几个节点
int TreeSize(BTNode* root)
{
	if (root == NULL)
	{
		return 0;
	}
	return TreeSize(root->left) + TreeSize(root->right) + 1;
}
//销毁树采用后序遍历
void Destory2Tree(BTNode* root)
{
	if (root == NULL)
	{
		return;
	}
	Destory2Tree(root->left);
	Destory2Tree(root->right);
	free(root);
	root = NULL;
}
//求一棵树的叶子节点的个数
int TreeLeafSize(BTNode* root)
{
	if (root == NULL)
	{
		return 0;
	}
	if ((root->left == NULL) && (root->right == NULL))
	{
		return 1;
	}
	return TreeLeafSize(root->left) + TreeLeafSize(root->right);
}

//求这几个叶子节点
void TreeLeafNode(BTNode* root)
{
	if (root == NULL)
	{
		return;
	}
	if ((root->left == NULL) && (root->right == NULL))
	{
		printf(" %c ", root->data);
	}
	else
	{
		TreeLeafNode(root->left);
		TreeLeafNode(root->right);
	}
}
//求这个树的最大深度
int TreeDepth(BTNode* root)
{
	if (root == NULL)
	{
		return 0;
	}
	int left = TreeDepth(root->left) + 1;
	int right = TreeDepth(root->right) + 1;
	return left > right ? left : right;

}

// 二叉树第k层节点个数
int TreeLevelKSize(BTNode* root, int k)
{
	if (root == NULL)
	{
		return 0;
	}
	if (k == 1)
	{
		return 1;
	}
	return TreeLevelKSize(root->left, k - 1) + TreeLevelKSize(root->right, k - 1);
}
// 二叉树查找值为x的节点
BTNode* BinaryTreeFind(BTNode* root, AdataType x)
{
	//递归的结束条件:
	if (root == NULL)
	{
		return NULL;
	}
	if (root->data == x)
	{
		return root;
	}
	//单边查找:先左后右
	if (BinaryTreeFind(root->left, x))//如果左边为空则向右查找
	{
		return BinaryTreeFind(root->left, x); //不为空则向下递归查找
	}
	else
	{
		return BinaryTreeFind(root->right, x);
	}
}
//判断这棵树是不是平衡二叉树
bool IsBalanced(BTNode* root)
{
	if (root == NULL)//若是空树,也满足平衡二叉树
	{
		return true;
	}
	int leftDepth = TreeDepth(root->left);
	int rightDepth = TreeDepth(root->right);
	return abs(leftDepth - rightDepth) < 2 && IsBalanced(root->left)
		&& IsBalanced(root->right);
}

test.c文件

#include"Tree.h"

void Test1()
{
	BTNode root;
	//意义不大,但还是写了一个
	TreeInit(&root);
	BTNode* A = TreeNode(&root, 'A');
	BTNode* B = TreeNode(&root, 'B');
	BTNode* C = TreeNode(&root, 'C');
	BTNode* D = TreeNode(&root, 'D');
	BTNode* E = TreeNode(&root, 'E');
	BTNode* F = TreeNode(&root, 'F');
	BTNode* G = TreeNode(&root, 'G');
	BTNode* H = TreeNode(&root, 'H');

	//关联成为一棵树
	A->left = B;
	A->right = C;
	B->left = D;
	B->right = E;
	E->right = H;
	C->left = F;
	C->right = G;
	printf(" PrevOrder:> ");
	PrevOrder(A);
	printf("\n");
	printf(" InOrder:>   ");
	InOrder(A);
	printf("\n");
	printf(" PostOrder:> ");
	PostOrder(A);
	printf("\n");

	int Depth = TreeDepth(A);
	printf(" Depth=%d \n", Depth);
	int Size = TreeSize(A);
	printf(" Size=%d \n", Size);
	printf(" TreeLeafNode:> ");
	TreeLeafNode(A);
	printf("\n");
	int KSize = TreeLevelKSize(A, 3);
	printf(" KSize=%d \n", KSize);
	BTNode* find = BinaryTreeFind(A, 'H');
	printf("查找到了 %c \n", find->data);

	printf(" IsBalanced>: ");
	if (IsBalanced(A))
	{
		printf(" the tree is balance tree!\n");
	}
	else
	{
		printf(" the tree is not balance tree!\n");
	}
	Destory2Tree(A);
	printf("树已销毁\n");
}

int main()
{
	Test1();
	return 0;
}

结果:


铁汁们快去试试吧,下期见!!!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vision Pro零基础教程专栏:校准、对比与结果分析工具

文章目录 CogCalibCheckerboardTool 校准工具介绍校准的基本方法与过程校准的基本作用标定片标定板定义标定板分类基础版标定板校准版标定板DataMatrix代码标定板特殊功能标定板材质分类 使用步骤注意 CogPatInspectTool 对比工具介绍CogPatInspectTool示例图使用场景使用步骤参…

JumpServer搭建堡垒机实战

文章目录 第一步、下载安装第二步、访问异常处理【1】docker方式拉取失败 JumpServer是运维人员可连接内部服务器上进行操作&#xff0c;支持Linux等操作系统的管理工具。 第一步、下载安装 curl -sSL https://resource.fit2cloud.com/jumpserver/jumpserver/releases/latest/…

Opencv Python图像处理笔记一:图像、窗口基本操作

文章目录 前言一、输入输出1.1 图片读取显示保存1.2 视频读取保存1.3 文件读取保存 二、GUI2.1 窗口2.2 轨迹条2.3 画图2.4 鼠标回调 三、图像入门操作3.1 颜色空间转化3.2 通道分离合并3.3 添加边框3.4 算数操作 四、二值化4.1 普通4.2 自适应4.3 Otsu 参考 前言 随着人工智能…

227基于matlab的作业调度问题

基于matlab的作业调度问题。采用遗传算法&#xff0c;解决作业调度问题。一共三个作业&#xff0c;每个作业有不同的时间长度和紧急程度&#xff0c;超过时间会有惩罚措施。通过遗传算法计算出最好的作业安排&#xff0c;使得惩罚最小&#xff0c;获益最大。最终结果通过GUI用甘…

了解IPS和IDS:这5个差异将改变你的安全观念!

IPS 代表 入侵防御系统&#xff08;Intrusion Prevention System&#xff09;&#xff0c;它是 IDS 的进一步发展&#xff0c;不仅具备检测攻击的能力&#xff0c;还能在检测到攻击后主动采取措施阻止攻击。IPS 通常部署在防火墙和网络设备之间&#xff0c;能够深度感知并检测流…

第八周学习笔记DAY.1-异常

本课目标 了解异常概念 理解Java异常处理机制 会捕捉异常 会抛出异常 了解Java异常体系结构 什么是异常 异常是指在程序的运行过程中所发生的不正常的事件&#xff0c;它会中断正在运行的程序 生活中&#xff0c;根据不同的异常进行相应的处理&#xff0c;而不会就此中断…

支持中文繁体,支持同时配置并启用飞书和Lark认证,JumpServer堡垒机v3.10.8 LTS版本发布

2024年4月22日&#xff0c;JumpServer开源堡垒机正式发布v3.10.8 LTS版本。JumpServer开源项目组将对v3.10 LTS版本提供长期的支持和优化&#xff0c;并定期迭代发布小版本。欢迎广大社区用户升级至v3.10 LTS最新版本&#xff0c;以获得更佳的使用体验。 在v3.10.8 LTS版本中&…

【js】解决读取文件源内容总是得到默认index.html

在项目开发中&#xff0c;资源的获取都可以通过网络&#xff0c;所以获取文件内容&#xff0c;只需要将文件地址作为请求发送即可 读取文件源内容 const path 资源地址&#xff08;必须是绝对路径&#xff09;fetch(path).then((response) > {if (!response.ok) {throw ne…

我与C++的爱恋:日期计算器

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;我与C的爱恋 朋友们大家好啊&#xff0c;在我们学习了默认成员函数后&#xff0c;我们通过上述内容&#xff0c;来实现一个简易的日期计算器。 ​ ​ 头文件的声明 #pragma once #incl…

计算机服务器中了locked勒索病毒怎么办,locked勒索病毒解密工具流程步骤

随着网络技术的不断应用与发展&#xff0c;越来越多的企业离不开网络&#xff0c;网络大大提升了企业的办公效率水平&#xff0c;也为企业的带来快速发展&#xff0c;对于企业来说&#xff0c;网络数据安全成为了大家关心的主要话题。近日&#xff0c;云天数据恢复中心接到多家…

Spring - 2 ( 14000 字 Spring 入门级教程 )

一&#xff1a;Spring Web MVC⼊⻔ Spring Web MVC 是⼀个 Web 框架&#xff0c;简称之为: Spring MVC 要真正的理解什么是 Spring MVC&#xff1f;我们⾸先要搞清楚什么是 MVC&#xff1f; 1.1 MVC 定义 MVC 是 Model View Controller 的缩写&#xff0c;它是软件⼯程中的…

丰田是如何用精益理念改变制造业的?

丰田&#xff0c;这个全球知名的汽车制造商&#xff0c;不仅以其高质量的产品赢得了消费者的信赖&#xff0c;更以其独特的精益理念深刻改变了整个制造业的面貌。那么&#xff0c;丰田究竟是如何用精益理念引领制造业变革的呢&#xff1f;天行健精益管理培训公司解析如下&#…

了解BACnet的对象模型 (三)

文章目录 前言18个对象BACnet 对象的属性设备对象&#xff08;Device&#xff09;的属性输入输出值对象类型及其属性 在代码中的表达Device对象的属性模拟输入对象的属性 小结 前言 在楼宇自控网络中&#xff0c;各种设备之间要进行数据交换&#xff0c;为了能够实现设备的互操…

[C++][算法基础]求组合数(II)

给定 &#x1d45b; 组询问&#xff0c;每组询问给定两个整数 &#x1d44e;&#xff0c;&#x1d44f;&#xff0c;请你输出 的值。 输入格式 第一行包含整数 &#x1d45b;。 接下来 &#x1d45b; 行&#xff0c;每行包含一组 &#x1d44e; 和 &#x1d44f;。 输出格…

【Java框架】SpringMVC(二)——SpringMVC数据交互

目录 前后端数据交互RequestMapping注解基于RequestMapping注解设置接口的请求方式RequestMapping注解的常用属性一个方法配置多个接口method属性params属性headers属性consumes属性produces属性 SpringMVC中的参数传递默认单个简单参数默认多个简单参数默认参数中有基本数据类…

机器学习-11-基于多模态特征融合的图像文本检索

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中图像文本检索技术。此技术把自然语言处理和图像处理进行了融合。 参考 2024年&#xff08;第12届&#xff09;“泰迪杯”数据挖掘挑战赛 图像特征提取&#xff08;VGG和Resnet特征提取卷积过程详解&…

Python 比较文本文件

1、问题背景 我们需要比较一个文本文件 F 与路径下多个其他文本文件之间的差异。我们已经编写了以下代码&#xff0c;但只能输出一个文件的比较结果。我们需要修改代码&#xff0c;以便比较所有文件并打印所有结果。 import difflib import fnmatch import osfilelist[] f op…

Linux 网络操作命令Telnet

Telnet 尽管 Telnet 已经逐渐被更安全的 SSH 协议所取代&#xff0c;但在某些特定场景下&#xff0c;如对旧系统的维护或教育目的&#xff0c;Telnet 仍然有其使用价值。本文将介绍如何在 Linux 系统中安装 Telnet 客户端&#xff0c;以及如何使用它进行远程登录。 用户使用 t…

基于SpringBoot+Vue的网上摄影工作室(含源码数据库+文档免费送)

项目演示视频&#xff1a; 基于SpringBootVue的网上摄影工作室&#xff08;含源码数据库文档免费送&#xff09; 基于SpringBootVue的网上摄影工作室&#xff08;含源码数据库文档免费送&#xff09; 开发系统:Windows10 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工…

JEECG表格选中状态怎么去掉

官网代码&#xff08;在取消选中状态的时候不生效&#xff09; rowSelection() {return {onChange: (selectedRowKeys, selectedRows) > {console.log(selectedRowKeys: ${selectedRowKeys}, selectedRows: , selectedRows);},getCheckboxProps: record > ({props: {disa…