二叉树

目录

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;elsereturn 0;
}

3二叉树的深度

最大深度

思路

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

伪代码如下

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

完全二叉树的结点数量

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

int nb(struct freenode* T)//传入根结点
{if (T == NULL)//为空返回0return 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)//为空返回高度为0return 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,不为平衡树返回-1return -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;
}

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

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

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

相关文章

每日OJ题_算法_前缀和②_牛客DP35 【模板】二维前缀和

目录 二维前缀和原理 ②牛客DP35 【模板】二维前缀和 解析代码 二维前缀和原理 在一维数组前缀和算法的基础上&#xff0c;想到&#xff1a;计算二维数组前缀和&#xff0c;不就和计算一维数组前缀和一样&#xff0c;即计算每一个位置的前缀和就相当于&#xff1a; 此位置的…

VUE引入DataV报错记录

DataV官网&#xff08;不支持Vue3&#xff09;&#xff1a;Welcome | DataV 一、按照官网引入后报错 【1】 Failed to resolve entry for package "dataview/datav-vue3". The package may have incorrect main/module/exports specified in its package.json. 将…

【Matlab】音频信号分析及FIR滤波处理——凯泽(Kaiser)窗

一、前言 1.1 课题内容: 利用麦克风采集语音信号(人的声音、或乐器声乐),人为加上环境噪声(窄带)分析上述声音信号的频谱,比较两种情况下的差异根据信号的频谱分布,选取合适的滤波器指标(频率指标、衰减指标),设计对应的 FIR 滤波器实现数字滤波,将滤波前、后的声音…

贪吃蛇/链表实现(C/C++)

本篇使用C语言实现贪吃蛇小游戏&#xff0c;我们将其分为了三个大部分&#xff0c;第一个部分游戏开始GameStart&#xff0c;游戏运行GameRun&#xff0c;以及游戏结束GameRun。对于整体游戏主要思想是基于链表实现&#xff0c;但若仅仅只有C语言的知识还不够&#xff0c;我们还…

学习笔记推荐:极客时间《Java常见错误100例》

最近&#xff0c;我有幸接触了一套非常精彩的学习笔记&#xff0c;《Java常见错误100例》。&#xff08;手册链接在文末&#xff01;&#xff01;&#xff01;&#xff09; 这套学习笔记出自极客时间&#xff0c;对于想要在 Java 开发领域深耕细作的朋友们来说&#xff0c;它无…

SpringBoot内置工具类

Collections java.util包下的Collections类&#xff0c;该类主要用于操作集合或者返回集合 一、排序 List<Integer> list new ArrayList<>();list.add(2);list.add(1);list.add(3);Collections.sort(list);//升序System.out.println(list);Collections.reverse(…

基于Python flask MySQL 猫眼电影可视化系统设计与实现

1 绪论 1.1 设计背景及目的 猫眼电影作为国内知名的电影信息网站&#xff0c;拥有海量的电影信息、票房数据和用户评价数据。这些数据对于电影市场的研究和分析具有重要意义。然而&#xff0c;由于数据的复杂性和数据来源的多样性&#xff0c;如何有效地采集、存储和展示这些数…

【Linux 内核源码分析】多核调度分析

多核调度 SMP&#xff08;Symmetric Multiprocessing&#xff0c;对称多处理&#xff09;是一种常见的多核处理器架构。它将多个处理器集成到一个计算机系统中&#xff0c;并通过共享系统总线和内存子系统来实现处理器之间的通信。 首先&#xff0c;SMP架构将一组处理器集中在…

程序员的基本素养之——R语言起源、特点以及应用

R语言是一种功能强大的数据分析、统计建模、可视化、 免费、开源且跨平台的编程语言 作为用于数据统计的必备技能语言&#xff0c;博主目前正在对R语言进行基本的学习&#xff0c;这也是生物信息学领域进行统计分析的必备语言之一。下面跟我来一起看看吧&#xff01; R语言是一…

鸿蒙自定义Http网络访问组件

前言 DevEco Studio版本:4.0.0.600 使用效果 如何使用 参考文档:OpenHarmony http数据请求 1、module创建 File-->New-->Module,选择Static Library 2、相关类创建 HttpCore:Http的核心类,用于http的请求 RequestMethod:http请求的类型,包含:GET、POST等 …

基本数据类型细节【java】

整形细节 1.java个整数类型有固定的范围和字段长度&#xff0c;不受具体OS【操作系统】的影响&#xff0c;以保证java程序的移植性 2.java的整型常量默认为int型&#xff0c;声明long型常量须在后面加l或者L int n1 1;//4个字节 //int n2 1L;//不对 long n3 1L; //对 3.J…

个性化联邦学习所面临的挑战:

个性化联邦学习所面临的挑战&#xff1a; 1、Federated Learning with Personalization Layers Li等人(2019)最近发表的综述文章阐述了联邦学习系统面临的许多独特挑战。其中一个挑战是&#xff0c;不同客户端的有效数据分布可能在参与的设备之间(可能有数百万台)差异很大。这…

04.领域驱动设计:了解聚合和聚合根,怎样设计聚合

目录 1、概述 2、聚合 3、聚合根 4、怎么设计聚合 4.1 聚合的构建过程主要步骤 第 1 步&#xff1a;采用事件风暴。 第 2 步&#xff1a;选出聚合根。 第 3 步&#xff1a;找出与聚合根关联的所有紧密依赖的实体和值对象。 第 4 步&#xff1a;画出对象的引用和依赖模型…

P2246 SAC#1 - Hello World(升级版)

网址如下&#xff1a; P2246 SAC#1 - Hello World&#xff08;升级版&#xff09; - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 刚开始是用递归做的&#xff0c;虽然用了哈希表优化&#xff0c;但是超时&#xff0c;只得了50 后面想到了一个新的算法&#xff0c;时间复杂度…

喝酒筛子小游戏集合源码微信小程序喝酒骰子程序带流量主版本源码酒桌玩筛子源码

2023新版酒桌小游戏喝酒小程序源码-&#xff08;流量主版本&#xff09; 修改增加了广告位 根据文档直接替换&#xff0c;原版本没有广告位 直接上传源码到开发者端即可 通过后改广告代码&#xff0c;然后关闭广告展示提交&#xff0c;通过后打开即可 无广告引流 流量主版…

3338 蓝桥杯 wyz的数组IV 简单

3338 蓝桥杯 wyz的数组IV 简单 //C风格解法1&#xff0c;通过率50% #include<bits/stdc.h>int main(){std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);int n; std::cin >> n;int ans 0;std::vector<int>a(n);for(auto &am…

必应聊天在当前安全搜索设置下不可用

使用Bing必应搜索引擎&#xff0c;想用必应AI聊天功能会提示&#xff1a;必应聊天在当前安全搜索设置下不可用。 当安全搜索设置设置为“严格”时&#xff0c;不支持必应聊天。 那么怎么修改安全搜索设置呢&#xff1f; 点击右上角的菜单图标&#xff0c;在下拉菜单里点击安全…

权威的健康养生与医学基础知识科普学习信息汇总

目录 1 关于健康与食物营养的权威网址1.1 世界卫生组织&#xff08;World Health Organization: WHO&#xff09;1.2 美国国家卫生研究院 (National Institutes of Health: NIH)1.3 澳大利亚政府健康门户 (Healthdirect)1.4 国际食品信息委员会 (International Food Informatio…

【Midjourney】内容展示风格关键词

1.几何排列(Geometric) "Geometric" 是一个与几何有关的词汇&#xff0c;通常用于描述与形状、结构或空间几何特征相关的事物。这个词可以涉及数学、艺术、工程、计算机图形学等多个领域。 使用该关键词后&#xff0c;图片中的内容会以平面图形拼接的方式展示&#…

Apache Shiro <= 1.2.4反序列化漏洞攻击 CVE-2016-4437 已亲自复现

Apache Shiro < 1.2.4反序列化漏洞攻击 CVE-2016-4437 已亲自复现 漏洞名称漏洞描述影响版本 漏洞复现环境搭建漏洞利用 修复建议总结 漏洞名称 漏洞描述 在 1.2.5 之前的 Apache Shiro 中&#xff0c;当未为“记住我”功能配置密钥时&#xff0c;远程攻击者可以通过未指定…