二叉树

目录

1翻转二叉树

2对称二叉树

3二叉树的深度

最大深度

最小深度

4二叉树的结点数量

完全二叉树的结点数量

5平衡二叉树

6 中序 后序求前序


二叉树结构体如下:

struct freenode {
	int data;
	struct freenode *lchild, *rchild;//左孩子 右孩子
}T;

1翻转二叉树

给你一个二叉树,让你向如图这样进行翻转

 思路

给一个二叉树进行翻转,实际就是交换每个结点的左右孩子指针,遍历使用前序,后序;中序比较麻烦

伪代码如下:

先序遍历

void nb(struct freenode *T)//传入根结点
{
	if (T == NULL)//如果结点指针为空直接结束
		return;
	struct freenode *t;
	t = T->lchild; T->lchild = T->rchild; T->rchild = t;
	nb(T->lchild);//左孩子
	nb(T->rchild);//右孩子
	return;
}

后序遍历

void nb(struct freenode *T)//传入根结点
{
	if (T == NULL)//如果结点指针为空直接结束
		return;
	nb(T->lchild);//左孩子
	nb(T->rchild);//右孩子
	struct freenode *t;//定义t用于交换
	t = T->lchild; T->lchild = T->rchild; T->rchild = t;
	return;
}

2对称二叉树

给你一个二叉树,判断二叉树是否对称

 思路

判断二叉树是否对称,根据图片可以看出,只需判断根结点的左右子树是否互为翻转,注意只能使用后序遍历,因为只有左右子树结点全部比较完才能确定是否为对称二叉树。

伪代码如下

//1为对称,0为不对称
int nb(struct freenode *p, struct freenode* q)//传入根结点的左右孩子
{
	if (p == NULL && q != NULL || p != NULL && q == NULL)//一边为空一边不为空
		return 0;
	else if (p == NULL && q == NULL)//两边同时为空
		return 1;
	else if (p->data != q->data)//两边都不为空且两边值不相等
		return 0;
	//剩下的两边都不为空且值相等还要继续判断
	int x, y;
	x = nb(p->lchild, q->rchild);//左结点的左孩子和右结点的右孩子比较
	y = nb(p->rchild, q->lchild);//左结点的右孩子和右结点的左孩子比较
	if (x == 1 && y == 1)
		return 1;
	else
		return 0;
}

3二叉树的深度

最大深度

思路

采用后序遍历,递归调用并返回每次最大深度

伪代码如下

int nb(struct freenode* T)//传入根结点
{
	if (T == NULL)//为空返回0
		return 0;
	return max(nb(T->lchild), nb(T->rchild)) + 1;//max返回两者较大值
}

最小深度

思路

求最小深度并不是将求最大深度的max改成min就行了,首先最小深度是指从根结点到叶子结点的最小值,如果只把求最大值的max改成min按照下面这个图得到的结果为1,而实际结果应该为3,我们知道叶子结点是没有左孩子和右孩子的,求最小深度问题就等价与求叶子结点,所以说在递归返回时如果没有左右孩子就返回零,如果只有其中一个孩子就返回那个孩子的值,如果有两个孩子就返回较小的那个,具体操作看代码

int nb(struct freenode* T)//传入根结点
{
	if (T->lchild == NULL && T->rchild == NULL)//没有左右孩子返回0
		return 0;
	else if (T->lchild != NULL && T->rchild == NULL)//没有右孩子,返回左孩子
		return nb(T->lchild);
	else if (T->lchild == NULL && T->rchild != NULL)//没有左孩子,返回右孩子
		return nb(T->rchild);
	return min(nb(T->lchild), nb(T->rchild)) + 1;//两个孩子都有,返回较小者
}

4二叉树的结点数量

给你一个二叉树,让你求二叉树的结点数量

思路

前序,中序,后序遍历都可以,后序遍历代码相对简洁一点,从根结点传入,按照递归三部曲

1,确定函数参数和返回类型:参数显然就是从根结点传入,我们要去求结点数量,返回的值肯定就是结点数,为int型

2,递归结束的条件:显然就是结点为空时返回0

3,单层递归逻辑:我们要去求结点数量,而每一层递归求得就是左子树结点的数量+右子树结点的数量+这个结点本身

代码如下(后序)

int nb(struct freenode* T)//传入根结点
{
	if (T == NULL)//为空返回0
		return 0;
    //返回左子树结点的数量和右子树结点的数量加上结点本身
	return nb(T->lchild) + nb(T->rchild) + 1;
}

完全二叉树的结点数量

对于求完全二叉树的结点数量,可以像上面那样用求二叉树结点数量的方法,不过还可以换种方法让代码运行的更快,我们知道一个满二叉树的结点数量为2^n-1(n为二叉树深度),一个完全二叉树按照左右子树递归拆分,肯定会有满二叉树,所以说在递归过程中遇到满二叉树直接返回2^n-1这样就可以节约时间,问题也就转换成如何判断子树为满二叉树了,完全二叉树的子树肯定也是完全二叉树,而判断一个完全二叉树是否为满二叉树,只需要判断二叉树最左下角的那个结点和最右下角的那个结点的深度是否一样。思路讲完上代码

int nb(struct freenode* T)//传入根结点
{
	if (T == NULL)//为空返回0
		return 0;
	struct freenode* left, * right;
	int sum1 = 1, sum2 = 1;
	left = T->lchild; right = T->rchild;
	while (left) //记录最左下角结点的深度
	{
		sum1++;
		left = left->lchild;
	}
	while (right)//记录最右下角结点的深度
	{
		sum2++;
		right = right->rchild;
	}
	if (sum1 == sum2)
		return pow(2, sum1) - 1;
	return nb(T->lchild) + nb(T->rchild) + 1;//返回左子树结点的数量和右子树结点的数量加上结点本身
}

5平衡二叉树

给你一个二叉树,判断二叉树是否为平衡二叉树

思路

平衡二叉树是指二叉树任何结点的左右子树高度差不超过1

判断一个二叉树是否为平衡二叉树也是根据定义来判断的,一个结点的高度是指到叶子结点的距离,求高度采用后序遍历。

代码如下

//-1代表不是平衡二叉树
int nb(struct freenode* T)//传入根结点
{
	if (T == NULL)//为空返回高度为0
		return 0;
	int left = nb(T->lchild);
	if (left == -1)//只要左子树的子树不为平衡树,那么这个树一定不为平衡树
		return -1;
	int right = nb(T->rchild);
	if (right == -1)//只要右子树的子树不为平衡树,那么这个树一定不为平衡树
		return -1;
	if (abs(left - right) > 1)//高度差大于1,不为平衡树返回-1
		return -1;
	return max(nb(T->lchild), nb(T->rchild)) + 1;//取左子树和右子树高度的较大值+1为本结点的高度
}

6 中序 后序求前序

 已知二叉树的中序和后序遍历结果,求前序遍历

 我们知道已知中序,后序可以确定唯一前序遍历结果,中前,中层也可以,前后不能确定唯一的中序

思路

后序遍历中的最后一个数一定是根结点,而在中序遍历中知道根结点是哪一个,又可以大致拆成左右两部分,根据中序拆成两部分又可以把后序拆成两部分,如此反复正是一个递归的过程,

模板题 洛谷P1030  求先序排列

题目描述

给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,且二叉树的节点个数 ≤8)。

输入格式

共两行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。

输出格式

共一行一个字符串,表示一棵二叉树的先序。

输入输出样例

输入 #1

BADC
BDCA

输出 #1

ABCD

说明/提示

【题目来源】

NOIP 2001 普及组第三题

#include<stdio.h>
#include<string.h>
char a[35], b[35];
void nb(int s1, int r1, int s2, int r2)//分别为中序后序的区间,左闭右开
{
	if (s1 >= r1)//为空时结束
		return;
	int i, j;
	for (i = s1; i < r1; i++)
	{
		if (a[i] == b[r2 - 1])//找到根结点,中序遍历拆成两部分
		{
			printf("%c", a[i]);
			break;
		}
	}
	for (j = s2; j < r2; j++)
	{
		if (r2 - j == r1 - i)//根据中序遍历拆分后序遍历
			break;
	}
	nb(s1, i, s2, j);//递归调用,左半部分
	nb(i + 1, r1, j, r2-1);递归调用,右半部分
	return;
}
int main()
{
	scanf("%s %s", a, b);
	int k, h;
	k = strlen(a);
	h = strlen(b);
	nb(0, k, 0, h);
	return 0;
}

已知中序,前序求后序,思路大概也是如此,只是根结点为先序的第一个值

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

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

相关文章

基于springboot+vue的在线商城系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

大数据处理,Pandas与SQL高效读写大型数据集

大家好&#xff0c;使用Pandas和SQL高效地从数据库中读取、处理和写入大型数据集&#xff0c;以实现最佳性能和内存管理&#xff0c;这是十分重要的。 处理大型数据集往往是一项挑战&#xff0c;特别是在涉及到从数据库读取和写入数据时。将整个数据集加载到内存中的传统方法可…

【第十六课】哈希表(acwing-840模拟散列表 / 拉链法 / 开放寻址法 / c++代码 )

目录 前言 哈希表思想 拉链法 开放寻址法 acwing-840模拟散列表 拉链法代码如下 开放寻址法代码 前言 我对哈希表的印象就是&#xff1a;感觉可以类比数组&#xff0c;像数组的下标和该下标所对的元素之间的关系一样&#xff0c;就是比如ha[0]1&#xff0c;那么我下标为…

mask transformer相关论文阅读

前面讲了mask-transformer对医学图像分割任务是非常适用的。本文就是总结一些近期看过的mask-transformer方面的论文。 因为不知道mask transformer是什么就看了一些论文。后来得出结论&#xff0c;应该就是生成mask的transformer就是mask transformer。 DETR 很多这些论文都…

机器学习 | 掌握Matplotlib的可视化图表操作

Matplotlib是python的一个数据可视化库&#xff0c;用于创建静态、动态和交互式图表。它可以制作多种类型的图表&#xff0c;如折线图、散点图、柱状图、饼图、直方图、3D 图形等。以渐进、交互式方式实现数据可视化。当然博主也不能面面俱到的讲解到所有内容&#xff0c;详情请…

新特性Record最全用法总结---动力节点总结

目录 0、有用的新特性 一、Record 1.1、Record的介绍&#xff1a; 1.2、Record的声明&#xff1a; 1.3、Record的创建&#xff1a; 1.4、Record使用举例&#xff1a; 1.5、Record-实例方法、静态方法 1.6、Record-三类构造方法 1.6.1、紧凑型构造、定制构造方法&#…

MySQL的启动与连接

一、启动MySQL服务 方式一&#xff1a;进入计算机管理界面&#xff0c;点击【服务】&#xff0c;找到【MYSQL80】&#xff0c;右键开启即可 方式二&#xff1a;以管理员身份打开powershell, 输入命令net start MYSQL80. 二、连接MySQL服务 进入MySQL的安装目录中的bin目录&a…

【jetson笔记】torchaudio报错

原因是因为pip安装的包与jetson不兼容导致 自己安装或者cmake编译也会报错 需要拉取官方配置好的docker镜像 拉取docker镜像 具体容器可以看官网&#xff0c;按照自己需求拉取即可 https://catalog.ngc.nvidia.com/orgs/nvidia/containers/l4t-ml 如果其他包不需要只需要torc…

Supplier 惰性调用和 Future#get 同步等待调用结合

&#x1f4d6;一、背景介绍 关于任务异步执行&#xff0c;两个点不可避免&#xff1a;异步结果和异步回调。 而在我的工程中有这样一段代码&#xff1a;使用 CompletableFuture 进行封装&#xff0c;可以异步执行&#xff0c;异步回调&#xff0c;通过 get() 等待异步任务的结…

ArcEngine添加点要素、线要素、面要素及学习总结

基于C#的ArcEngine二次开发教程&#xff08;13&#xff09;&#xff1a;点、线、面要素的绘制_arcengine onmousedown-CSDN博客 https://www.cnblogs.com/cannel/p/11074343.html ArcEngine绘制点、线、多边形、矩形、圆形、椭圆的代码_arcengine 开发 生成矩形-CSDN博客 https…

《数学之友》期刊投稿方式投稿邮箱

《数学之友》是国家新闻出版总署批准的正规期刊&#xff0c;设置的栏目主要有&#xff1a;数学教育、教材研究、教学研究、数学建模、思想方法、数学学习、解题探索、CAI专题、复习考试、错例剖析等。从解题技巧方法、数学问题的溯源探微释疑到新课程背景下的教改教法教案&…

Qt事件处理,提升组件类

1.相关说明 1.提升组件QLabel的类&#xff0c;以实现双击功能 2.监控键盘事件&#xff0c;实现上下左右移动 3.鼠标点击获取坐标 2.相关界面 3.相关代码和操作 自定义类TMyLabel&#xff0c;父类为QLabel tmylabel.h #ifndef TMYLABEL_H #define TMYLABEL_H #include <QL…

thinkphp+vue+mysql旅游推荐攻略分享网站p0667

基于php语言设计并实现了旅游分享网站。该系统基于B/S即所谓浏览器/服务器模式&#xff0c;应用thinkphp框架&#xff0c;选择MySQL作为后台数据库。系统主要包括用户、景点信息、攻略分类、旅游攻略、门票购买、留言反馈、论坛管理、系统管理等功能模块。运行环境:phpstudy/wa…

CSC7225

CSC7225 为高性能电流模式 PWM 开关电源控制器&#xff0c;满足绿色环保标准&#xff1b;广泛适用于经济型开关电源&#xff0c;如 DVD、机顶盒、传真机、打印机、LCD 显示器等。CSC7225 采用 DIP-8 封装。 CSC7225主要特点  CSC7225内置 700V 高压功率开关管&#xff0c;外…

解读人工智能:AI时代的奇迹与担忧

随着科技的迅猛发展&#xff0c;人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;逐渐进入人们的视野。那么&#xff0c;什么是人工智能呢&#xff1f;简单来说&#xff0c;它是一种模拟人类智能的技术&#xff0c;通过计算机系统实现人类所具备的思…

GBASE南大通用数据库GBase 8s常见问题解析 -- 查找锁会话并解锁

本文摘自GBASE南大通用社区&#xff0c;by&#xff1a;wty&#xff0c;原文请点击&#xff1a;GBase 8s常见问题 -- 查找锁会话并解锁|GBASE社区|天津南大通用数据技术股份有限公司|GBASE-致力于成为用户最信赖的数据库产品供应商 问题现象 执行SQL时报错 244: Could not do…

6.PR-AUC机器学习模型性能的常用的评估指标

PR-AUC PR-AUC&#xff0c;即精确率-召回率曲线下的面积&#xff0c;是一种用于评估分类模型性能的指标。与ROC-AUC&#xff08;接收者操作特征曲线下的面积&#xff09;不同&#xff0c;PR-AUC关注的是精确率和召回率之间的关系&#xff0c;特别适用于不平衡数据集。 精确率…

【大数据】YARN调度器及调度策略

YARN调度器 YARN负责作业资源调度&#xff0c;在集群中找到满足业务的资源&#xff0c;帮助作业启动任务&#xff0c;管理作业的生命周期。 ​ YARN技术架构 ​ 目前&#xff0c;Hadoop作业调度器主要有三种&#xff1a;先进先出调度器&#xff08;First In First Out&…

雪花算法生成ID【细糠】

目录 &#x1f9c2;1.ID生成规则 &#x1f953;2.UUID &#x1f32d;3.数据库自增主键 &#x1f37f;4.雪花算法 1.ID生成规则 1. 全局唯一2.趋势递增3.单调递增4.信息安全5.含时间戳 2.UUID UUID(Universally Unique Identifier)的标准型式包含32个16进制数字,以连字…

Windows和Linux访问不了GitHub的解决方法

一、Windows访问不了GitHub 问题描述 使用Windows访问GitHub时&#xff0c;出现如下情况&#xff0c;显示无法访问。 解决方案&#xff1a; 打开域名查询网站&#xff1a;https://tool.chinaz.com/dns 输入GitHub的域名&#xff0c;点击立即检测。 出现如下页面&#xff0c…