二叉树的增删查改

news2024/11/20 14:26:22

本节复习二叉树的增删查改, 二叉树的知识相对于前面的循序表, 链表, 以及栈和队列都要多一些。 同时二叉树的增删查改理解起来相对来说要困难一些。 本节来好好复习一下二叉树的增删查改。

目录

准备文件

创建结构体蓝图

二叉树的前序遍历

二叉树的后序遍历

二叉树的中序遍历

二叉树的节点个数

二叉树的叶子节点个数

二叉树的深度

判断二叉树是否为平衡二叉树

二叉树节点销毁


准备文件

首先准备好三个文件:

一个文件用于main.c调试, 一个文件用于二叉树函数的声明, 还有一个.c文件用于二叉树函数的实现。 

创建结构体蓝图

首先包含一下头文件和重新定义一下我们要保存的数据类型。 这样做是为了便于维护我们的代码

///二叉树的增删查改/
#include<stdio.h>
#include<stdlib.h>
#include"Queue.h"
#include<assert.h>


typedef int TNDataType;

然后创建结构体

///二叉树的增删查改/
#include<stdio.h>
#include<stdlib.h>
#include"Queue.h"
#include<assert.h>


typedef int TNDataType;

typedef struct TreeNode 
{
	struct TreeNode* left;
	struct TreeNode* right;
	TNDataType data;
}TNode;

二叉树的前序遍历

.h函数声明

///二叉树的增删查改/
#include<stdio.h>
#include<stdlib.h>
#include"Queue.h"
#include<assert.h>


typedef int TNDataType;

typedef struct TreeNode 
{
	struct TreeNode* left;
	struct TreeNode* right;
	TNDataType data;
}TNode;

///接口函数的声明///

//二叉树的前序遍历
void PrevOrder(TNode* root);

.c函数实现

//前序遍历
void PrevOrder(TNode* root) 
{

	if (root == NULL) 
	{
		return;
	}
	printf("%d ", root->data);//每一个根节点都有左子树和右子树,这三行代码的意思是先访问根节点。 
								//然后访问左子树, 再访问右子树。然后访问左右子树的时候, 又先访问根节点, 再访问该子树的左右子树
	PrevOrder(root->left);
	PrevOrder(root->right);
}

二叉树的后序遍历

.h函数声明

///二叉树的增删查改/
#include<stdio.h>
#include<stdlib.h>
#include"Queue.h"
#include<assert.h>


typedef int TNDataType;

typedef struct TreeNode 
{
	struct TreeNode* left;
	struct TreeNode* right;
	TNDataType data;
}TNode;

///接口函数的声明///

//二叉树的前序遍历
void PrevOrder(TNode* root);

//二叉树的后序遍历
void PostOrder(TNode* root);

.c函数实现

//后序遍历
void PostOrder(TNode* root) 
{
	if (root == NULL) 
	{
		return;
	}
	PostOrder(root->left);     //每一个根节点都有左右子树, 这三行代码的意思是先访问左右子树, 最后在访问根节点, 然后
							   //在访问每一棵左右子树的时候又先访问该子树的左右子树, 然后层层递归
	PostOrder(root->right);
	printf("%d ", root->data);

}

二叉树的中序遍历

.h函数声明

///二叉树的增删查改/
#include<stdio.h>
#include<stdlib.h>
#include"Queue.h"
#include<assert.h>


typedef int TNDataType;

typedef struct TreeNode 
{
	struct TreeNode* left;
	struct TreeNode* right;
	TNDataType data;
}TNode;

///接口函数的声明///

//二叉树的前序遍历
void PrevOrder(TNode* root);

//二叉树的后序遍历
void PostOrder(TNode* root);

//二叉树的中序遍历
void MidOrder(TNode* root);

.c函数实现

//中序遍历
void MidOrder(TNode* root)
{
	if (root == NULL) 
	{
		return;
	}
	MidOrder(root->left);		//在每一个根节点都有左右子树, 这三行代码的意思是先访问左子树, 
								//再访问根节点, 最后再访问右子树, 然后, 当访问左子树的时候, 左子树又有左子树, 就又访问
								// 该子树的左子树, 直到遇到子树为空。  
	printf("%d ", root->data);
	MidOrder(root->right);
}

二叉树的节点个数

.h函数声明

///二叉树的增删查改/
#include<stdio.h>
#include<stdlib.h>
#include"Queue.h"
#include<assert.h>


typedef int TNDataType;

typedef struct TreeNode 
{
	struct TreeNode* left;
	struct TreeNode* right;
	TNDataType data;
}TNode;

///接口函数的声明///

//二叉树的前序遍历
void PrevOrder(TNode* root);

//二叉树的后序遍历
void PostOrder(TNode* root);

//二叉树的中序遍历
void MidOrder(TNode* root);

//二叉树的层序遍历层序遍历
void LevelOrder(TNode* root);

//二叉树计算节点个数
int SumTree(TNode* root);

.c函数实现


//二叉树计算节点个数
int SumTree(TNode* root) 
{
	if (root == NULL)//空节点代表着0个节点, 所以返回0个节点 
	{
		return 0;
	}
	//代码走到这, 说明不是空节点, 不是空节点那么节点就应该加一
	return SumTree(root->left) + SumTree(root->right) + 1;//节点加1, 同时遍历左右两棵子树。
}

二叉树的叶子节点个数

.h函数声明

///二叉树的增删查改/
#include<stdio.h>
#include<stdlib.h>
#include"Queue.h"
#include<assert.h>


typedef int TNDataType;

typedef struct TreeNode 
{
	struct TreeNode* left;
	struct TreeNode* right;
	TNDataType data;
}TNode;

///接口函数的声明///

//二叉树的前序遍历
void PrevOrder(TNode* root);

//二叉树的后序遍历
void PostOrder(TNode* root);

//二叉树的中序遍历
void MidOrder(TNode* root);

//二叉树的层序遍历层序遍历
void LevelOrder(TNode* root);

//二叉树计算节点个数
int SumTree(TNode* root);

//二叉树计算叶子个数
int LeafSumTree(TNode* root);

.c函数实现


//二叉树计算叶子个数
int LeafSumTree(TNode* root) 
{
	if (root->left == NULL && root->right == NULL) 
	{
		return 1;
	}
	int left = LeafSumTree(root->left);//查看左子树
	int right = LeafSumTree(root->right);//查看右子树, 为什么要用right?因为返回值带着计算的节点个数, 如果这两个递归函数
										//不接收返回值, 那么就相当于只有遍历到叶子节点的时候返回节点,接收到叶子节点返回值
										//的节点不能继续将值返回给父节点。 
	return left + right;
}

二叉树的深度

.h函数声明

///二叉树的增删查改/
#include<stdio.h>
#include<stdlib.h>
#include"Queue.h"
#include<assert.h>


typedef int TNDataType;

typedef struct TreeNode 
{
	struct TreeNode* left;
	struct TreeNode* right;
	TNDataType data;
}TNode;

///接口函数的声明///

//二叉树的前序遍历
void PrevOrder(TNode* root);

//二叉树的后序遍历
void PostOrder(TNode* root);

//二叉树的中序遍历
void MidOrder(TNode* root);

//二叉树的层序遍历层序遍历
void LevelOrder(TNode* root);

//二叉树计算节点个数
int SumTree(TNode* root);

//二叉树计算叶子个数
int LeafSumTree(TNode* root);

//二叉树的深度
int TallTree(TNode* root);

.c函数实现


//计算树的深度
int TallTree(TNode* root) //计算树的深度的核心就是左右子树哪个高, 在他的基础上加1。
{
	if (root == NULL) 
	{
		return 0;
	}
	//
	int left = TallTree(root->left);
	int right = TallTree(root->right);
	return (left > right) ? (left + 1) : (right + 1);
}

判断二叉树是否为平衡二叉树

.h函数声明

///二叉树的增删查改/
#include<stdio.h>
#include<stdlib.h>
#include"Queue.h"
#include<assert.h>


typedef int TNDataType;

typedef struct TreeNode 
{
	struct TreeNode* left;
	struct TreeNode* right;
	TNDataType data;
}TNode;

///接口函数的声明///

//二叉树的前序遍历
void PrevOrder(TNode* root);

//二叉树的后序遍历
void PostOrder(TNode* root);

//二叉树的中序遍历
void MidOrder(TNode* root);

//二叉树的层序遍历层序遍历
void LevelOrder(TNode* root);

//二叉树计算节点个数
int SumTree(TNode* root);

//二叉树计算叶子个数
int LeafSumTree(TNode* root);

//二叉树的深度
int TallTree(TNode* root);

//判断是否为平衡二叉树
bool TreeEqual(TNode* root);

.c函数实现

//计算树的深度
int TallTree(TNode* root) //计算树的深度的核心就是左右子树哪个高, 在他的基础上加1。
{
	if (root == NULL) 
	{
		return 0;
	}
	//
	int left = TallTree(root->left);
	int right = TallTree(root->right);
	return (left > right) ? (left + 1) : (right + 1);
}

二叉树节点销毁

.h函数声明

///二叉树的增删查改/
#include<stdio.h>
#include<stdlib.h>
#include"Queue.h"
#include<assert.h>


typedef int TNDataType;

typedef struct TreeNode 
{
	struct TreeNode* left;
	struct TreeNode* right;
	TNDataType data;
}TNode;

///接口函数的声明///

//二叉树的前序遍历
void PrevOrder(TNode* root);

//二叉树的后序遍历
void PostOrder(TNode* root);

//二叉树的中序遍历
void MidOrder(TNode* root);

//二叉树的层序遍历层序遍历
void LevelOrder(TNode* root);

//二叉树计算节点个数
int SumTree(TNode* root);

//二叉树计算叶子个数
int LeafSumTree(TNode* root);

//二叉树的深度
int TallTree(TNode* root);

//判断是否为平衡二叉树
bool TreeEqual(TNode* root);

//二叉树销毁
void TreeDestroy(TNode* root);

.c函数实现


//二叉树的销毁
void TreeDestroy(TNode* root) //二叉树的销毁应该是一个后序遍历
{
	if (root->left == NULL && root->right == NULL)
	{
		free(root);
		root = NULL;
		return;
	}
	else 
	{
		if (root->left != NULL) 
		{
			TreeDestroy(root->left);

		}
		else if (root->right != NULL)
		{
			TreeDestroy(root->right);

		}
	}
	

}

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

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

相关文章

【数据分享】2001-2022年我国省市县镇四级的逐日平均降水量数据(免费获取\excel\shp格式)

降水数据是我们在各项研究中最常用的气象指标之一&#xff01;之前我们给大家分享过来源于国家青藏高原科学数据中心发布的1961—2022年全国范围的逐日降水栅格数据&#xff08;可查看之前的文章获悉详情&#xff09;&#xff01; 本次我们分享的是2001-2002年我国省市县镇四个…

【中科院计算所】WSDM 2024冠军方案:基于大模型进行多文档问答

作者&#xff1a;李一鸣 张兆 中科院计算所 会话式多文档问答旨在根据检索到的文档以及上下文对话来回答特定问题。 在本文中&#xff0c;我们介绍了 WSDM Cup 2024 中“对话式多文档 QA”挑战赛的获胜方法&#xff0c;该方法利用了大型语言模型 (LLM) 卓越的自然语言理解和生…

Pyhton的组合数据类型

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 生命对某些人来说是美丽的&#xff0c…

二分查找讲解

关于我为什么要写单独开一篇文章写二分,实际上那么多困难的算法,比如线段树,并查集等等都没有难倒我,我最近却被二分难倒了,而且是两次,两次在赛场上做不出来二分的应用题,于是我决定写一篇二分查找的算法总结.刚接触算法的时候本来是要写一篇的,但后面因为各种原因搁置了,现在…

lv20 QT主窗口

熟悉创建主窗口项目 1 QAction 2 主窗口 菜单栏&#xff1a;fileMenu menuBar()->addMenu(tr("&File")); 工具栏&#xff1a;fileToolBar addToolBar(tr("File")); 浮动窗&#xff1a;QDockWidget *dockWidget new QDockWidget(tr("Dock W…

云上攻防-云服务篇弹性计算服务器云数据库实例元数据控制角色AK控制台接管

知识点: 1、云服务-弹性计算服务器-元数据&SSRF&AK 2、云服务-云数据库-外部连接&权限提升 章节点&#xff1a; 云场景攻防&#xff1a;公有云&#xff0c;私有云&#xff0c;混合云&#xff0c;虚拟化集群&#xff0c;云桌面等 云厂商攻防&#xff1a;阿里云&am…

Pytorch学习 day01(Jupyter安装

Jupyter 安装过程中遇到的问题&#xff1a; Anaconda的base环境会自动安装Jupyter&#xff0c;但是如果我们要在其他环境中安装Jupyter&#xff0c;就需要注意&#xff0c;该环境的python版本不能高于3.11&#xff0c;且用以下代码安装&#xff1a; conda install nb_conda_…

深度学习 精选笔记(8)梯度消失和梯度爆炸

学习参考&#xff1a; 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增)&#xff0c;以达到集多方教程的精华于一文的目的。 ③非常推荐上面&#xff08;学习参考&#x…

微信小程序 vs 公众号商城:亿发解密线上业务的最佳选择之道

在拓展线上业务的道路上&#xff0c;搭建线上商城成为企业首要选择。然而&#xff0c;在选择小程序商城和公众号商城时&#xff0c;很多企业陷入了两者之间的纠结。本文将深入解答小程序商城和公众号商城的概念、区别&#xff0c;并为您提供明智的选择建议。 一、小程序商城和公…

Flutter开发之Slider

Flutter开发之Slider 本文是关于介绍Slider相关属性的含义。 class SliderThemeData {/// slider轨道的高度 final double? trackHeight; /// 滑块滑过的轨道颜色 final Color? activeTrackColor; /// 滑块未滑过的轨道颜色 final Color? inactiveTrackColor; /// 滑块滑过…

多人同时导出 Excel 干崩服务器?我们来实现一个排队导出功能!

考虑到数据库数据日渐增多&#xff0c;导出会有全量数据的导出&#xff0c;多人同时导出可以会对服务性能造成影响&#xff0c;导出涉及到mysql查询的io操作&#xff0c;还涉及文件输入、输出流的io操作&#xff0c;所以对服务器的性能会影响的比较大&#xff1b; 结合以上原因…

李沐动手学习深度学习——3.2练习

以下是个人理解&#xff0c;希望进行讨论求解。 练习 1. 如果我们将权重初始化为零&#xff0c;会发生什么。算法仍然有效吗&#xff1f; 根据SGD算法公式如上&#xff0c;第一次迭代的值可知w只与b相关&#xff0c;而对于b的迭代更新&#xff0c;只是与b的初始值相关&#x…

什么是物联网?

今天这篇文章写的相关内容就是带领大家了解什么是物联网&#xff0c;之前写的文章大多都是一些物联网的未来&#xff0c;行业的解决方案等&#xff1b;话不多说开始进入正题吧! 物联网(IoT)是一个包罗万象的术语&#xff0c;指的是越来越多的电子产品&#xff0c;它们不是传统的…

【2022 J1】乘方

本主又双叒叕来更新了&#xff0c;一圈三连不用说了吧&#x1f601; 本题是J组第二轮的题&#xff1a; 题目描述 小文同学刚刚接触了信息学竞赛&#xff0c;有一天她遇到了这样一个题&#xff1a;给定正整数 a 和 b&#xff0c;求 &#xfffd;&#xfffd;ab 的值是多少。 …

Java优先级队列--堆

目录 1. 优先级队列 1.1 概念 2.优先级队列的模拟实现 2.1 堆的概念 2.2 堆的存储方式 2.3 堆的创建 2.3.1 堆向下调整 2.3.2 堆的创建 2.3.3 建堆的时间复杂度 2.4 堆的插入与删除 2.4.1 堆的插入 2.4.2 堆的删除 2.5 用堆模拟实现优先级队列 3.常用接口介绍 3…

Windows下使用C++调用海康威视SDK获取实时视频流进行检测

目录 准备海康威视的SDK官网下载下载后解压 Vs 2022创建项目创建32位的环境 将相关文件复制到工程目录下工程配置海康威视SDK配置包含目录配置库目录将dll文件添加到环境中在附加依赖项添加如下内容 工程配置OpenCV配置工程配置包含目录配置库目录 测试 准备海康威视的SDK 官网…

深入理解Linux线程(LWP):概念、结构与实现机制(1)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;会いたい—Naomile 1:12━━━━━━️&#x1f49f;──────── 4:59 &#x1f504; ◀️ ⏸ ▶️ ☰ &a…

JavaScript | 拼客JavaScript的P211-循环精灵图 精灵图及个人手敲代码分享

拼客JavaScript的P211-循环精灵图 JavaScript前端课程-dom-bom-js-es6新语法-jQuery-数据可视化echarts黑马pink老师前端入门基础视频教程(500多集)持续 视频中的拼客老师使用的是淘宝首页的精灵图资源24-595图片 精灵图24-595 我还找到另一张大一点的精灵图&#xff0c;内容…

【力扣 - 杨辉三角】

题目描述 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示例 2: 输入: numRows 1 输出: [[1]] 提示: 1 < numRows < 30 方法一&#xff1a;数学 思路…

一图总结:华为销售体系(铁三角组织LTC流程)

《华为铁三角工作法》阅读了多遍&#xff0c;花了些时间整理了一张图对本书的框架性总结&#xff0c;从流程&#xff08;LTC&#xff09;、组织&#xff08;铁三角&#xff09;、激励和管理三个大方面概览华为销售体系。 核心是一靠流程&#xff0c;二靠团队&#xff0c;而前提…