重生之“我打数据结构,真的假的?”--4.二叉树

1.对称二叉树

. - 力扣(LeetCode)

 

思路 :

1.设置两个队列l,r,先将root的左节点入l,右节点入r。

2.分别出队,若出队元素相同

            Queuepush(&l, front->left);

            Queuepush(&l, front->right);

            Queuepush(&r, behind->right);

            Queuepush(&r, behind->left);

若不同则返回false

3.直至两队列都为空,返回true

typedef struct TreeNode* datatype;typedef struct Queuenode
{datatype data;struct Queuenode * next;
}Qnode;typedef struct QT
{Qnode* head;Qnode* tail;int size;
}QT;void QueueInit(QT* sl)
{assert(sl);sl->head = NULL;sl->tail = NULL;sl->size = 0;
}bool Queueempty(QT* sl)
{assert(sl);return sl->head ==NULL;
}void Queuepush(QT* sl, datatype x)
{assert(sl);Qnode* newnode = (Qnode*)malloc(sizeof(Qnode));newnode->next = NULL;newnode->data = x;if (Queueempty(sl)){sl->head = newnode;sl->tail = newnode;}else{sl->tail->next = newnode;sl->tail = newnode;}sl->size++;
}void Queuepop(QT* sl)
{assert(sl);assert(!Queueempty(sl));Qnode* next = sl->head->next;free(sl->head);sl->head = next;sl->size--;
}datatype Queuetop(QT* sl)
{assert(sl);assert(!Queueempty(sl));return sl->head->data;
}void Queuedestroy(QT* sl)
{assert(sl);while (!Queueempty(sl))Queuepop(sl);sl->head = sl->tail = NULL;sl->size = 0;
}bool isSymmetric(struct TreeNode* root) {if(root==NULL)return true;QT l;QT r;QueueInit(&l);QueueInit(&r);Queuepush(&l,root->left);Queuepush(&r,root->right);
while (!Queueempty(&r)&&!Queueempty(&l))
{struct TreeNode* front = Queuetop(&r);struct TreeNode* behind = Queuetop(&l);if((front!=NULL&&behind!=NULL)&&front->val==behind->val){ Queuepop(&r);Queuepop(&l);if(front){Queuepush(&l, front->left);Queuepush(&l, front->right);Queuepush(&r, behind->right);Queuepush(&r, behind->left);}}else if(front==NULL&&behind==NULL){Queuepop(&r);Queuepop(&l);}else if((front!=NULL&&behind==NULL)||(front==NULL&&behind!=NULL))return false;elsereturn false;
}if(Queueempty(&r)&&Queueempty(&l))return true;elsereturn false;
}

 

 

2.平衡二叉树

. - 力扣(LeetCode)

判断「平衡二叉树」的 2 个条件:

1. 是「二叉排序树」
2. 任何一个节点的左子树或者右子树都是「平衡二叉树」(左右高度差小于等于 1)

 

 思路

1.分别找出根节点的左子树高和右子树高(递归),若相差大于1;

则一定不是AVL树;

int BTreeheight(struct TreeNode* root,int* i)
{int flag;if (root == NULL){return 0;}int leftHeight = BTreeheight(root->left,i);int rightHeight= BTreeheight(root->right,i);if(leftHeight>=rightHeight)flag=leftHeight-rightHeight;elseflag=rightHeight-leftHeight;if(flag>1){*i=flag;}return  fmax(leftHeight , rightHeight ) + 1;
}bool isBalanced(struct TreeNode* root) {if(root==NULL)return true;int i=0;int height=BTreeheight(root,&i);if(i>1)return false;elsereturn true;
}

 

3.翻转二叉树

. - 力扣(LeetCode)

思路

1.左右节点交换,然后递归左节点与右节点 

void change(struct TreeNode* root)
{if(root){struct TreeNode* flag=root->left;root->left=root->right;root->right=flag;change(root->left);change(root->right);}
}

 

 4.另一棵树的子树

. - 力扣(LeetCode)

思路: 

1.需要先写判断两颗树是否相等的函数

bool isSameTree(struct TreeNode* p, struct TreeNode* q)

2.

(1)如果root==NULL;返回false

(2)如果isSameTree(root, subroot)

返回true

(3)递归  isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);

必须是||,只要左子树或右子树有一个和subroot相同即可)

bool isSameTree(struct TreeNode* p, struct TreeNode* q) {int i=0;if(p==NULL&&q==NULL)return true;if((p==NULL&&q!=NULL)||(p!=NULL&&q==NULL))return false;if(p->val!=q->val)return false;elsereturn isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);}bool isSubtree(struct TreeNode * root, struct TreeNode * subRoot) {if(root==NULL)return false;if(isSameTree(root, subRoot))return true;return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);}

5.中序遍历建立二叉树

二叉树遍历_牛客题霸_牛客网

思路

1.用arr存储字符串,并初始化二叉树BTnode* node

2.建立函数

void newbuynode(BTnode*& L, char* arr, int* i)

(这里使用了c++的引用,如果没有引用就得传二级指针,而且不方便)

3.if (L == NULL && arr[*i] != '#')

//开辟空间并存储数据

4.

else if (arr[*i] != '#')

            L->data = arr[*i];

        (*i)++;

//当前数据存储完后要跳向下一位

5.

if (L) {

            newbuynode(L->left, arr, i);

            newbuynode(L->right, arr, i);

        }

//反义就是如果该节点为空,而且也不需要存储数据,那么就不用递归了

 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <iostream>
using namespace std;typedef struct BinaryTree {char data;struct BinaryTree* left;struct BinaryTree* right;
} BTnode;void newbuynode(BTnode*& L, char* arr, int* i) {if (arr[*i] != '\0') {if (L == NULL && arr[*i] != '#') {BTnode* node = (BTnode*)malloc(sizeof(BTnode));node->data = arr[*i];node->left = NULL;node->right = NULL;L = node;} else if (arr[*i] != '#')L->data = arr[*i];(*i)++;if (L) {newbuynode(L->left, arr, i);newbuynode(L->right, arr, i);}}
}void midorder(BTnode*root) {      //前序排列(根,左子树,右子树)递归思想if (root == NULL) {return ;} else {midorder(root->left);printf("%c ",root->data);   //  根midorder(root->right);       //右子树}
}int main() {BTnode* node = (BTnode*)malloc(sizeof(BTnode));
node->data = 0;
node->left = NULL;
node->right = NULL;
char arr[100];
int i = 0;
cin.get(arr, 100);
newbuynode(node, arr, &i);
midorder(node);
return 0;}

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

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

相关文章

调度器——DolphinScheduler讲解及安装教程

调度器——DolphinScheduler讲解及安装教程 一&#xff1a;基本讲解 Dolphin Scheduler 1、开源的分布式任务调度系统 2、支持多种任务类型&#xff0c;包括Shell、Spark、Hive等 3、灵活的任务调度功能和友好的Web界面&#xff0c;方便管理和监控任务的执行情况 架构 操作系…

idea 自动生成pojo类

找到这个View>Tool Windows>Database配置数据库 配置好后刷新&#xff0c;查看是否连接上表 然后找到 点击后选择你将要生成的pojo需要保存到哪个文件&#xff0c;然后再次点击&#xff0c;就生成好了&#xff0c;然后自己稍作修改即可使用该pojo类了

Vue3可媲美Element Plus Tree组件实战之移除节点

Element Plus Tree自定义节点内容示例中介绍了移除节点的用法&#xff0c;个人觉得作为提供给用户API&#xff0c;应该遵循迪米特法则&#xff0c;把功能实现的细节封装在组件内部&#xff0c;而提供给用户最简单的操作方式&#xff0c;同时在此基础上支持用户的扩展。 因此&a…

【python学习】思考-如何在PyCharm中编写一个简单的Flask应用示例以及如何用cProfile来对Python代码进行性能分析

引言 Python中有两个流行的Web框架&#xff1a;Django和Flask。Django是一个高级的Python Web框架&#xff0c;它鼓励快速开发和干净、实用的设计&#xff1b;Flask是一个轻量级的Web应用框架&#xff0c;适用于小型到大型应用。以下是使用Flask创建一个简单应用的基本步骤cPro…

从工业到航空:旋转花键跨行业的多样用途解析!

旋转花键是一种新型的高效传动元件&#xff0c;主要由内花键和外花键组成。内花键和外花键之间放置着一排排滚珠&#xff0c;当内花键和外花键相对旋转时&#xff0c;滚珠在内、外花键之间滚动&#xff0c;从而实现动力的传递。 旋转花键的基本功能主要是用于连接轴和套的旋转部…

mmdetection训练后评估指标,验证Loss

项目场景&#xff1a; 对mmdetection框架下训练好的log.json文件进行评估。 问题描述 使用框架底下自带的评估文件&#xff0c;不能对loss进行评估。也就是文件&#xff1a;tools/analysis_tools/analyze_logs.py 解决方案&#xff1a; 自己做了评估loss的代码&#xff0c;目…

力扣94题(java语言)

题目 思路 使用一个栈来模拟递归的过程&#xff0c;以非递归的方式完成中序遍历(使用栈可以避免递归调用的空间消耗)。 遍历顺序步骤&#xff1a; 遍历左子树访问根节点遍历右子树 package algorithm_leetcode;import java.util.ArrayList; import java.util.List; import…

重磅发布:OpenAI宣布推出AI驱动的搜索引擎SearchGPT,将与Google和Perplexity展开竞争|TodayAI

OpenAI宣布推出其备受期待的AI驱动搜索引擎SearchGPT。该搜索引擎能够实时访问互联网信息&#xff0c;并将作为原型在有限范围内发布&#xff0c;计划最终将其功能整合到ChatGPT中。 SearchGPT的功能特点 SearchGPT是一个具有实时互联网信息访问能力的AI驱动搜索引擎。它的界面…

轨道式智能巡检机器人,助力综合管廊安全运维

1 引言 当前城市综合管廊建设已经成为世界范围内的发展趋势&#xff0c;2017年5月住建部、发改委联合发布《全国城市市政基础设施建设“十三五”规划》&#xff0c;截至2017年4月底国内地下综合管廊试点项目已开工建设687 km&#xff0c;建成廊体260 km&#xff0c;完成投资40…

用python程序发送文件(python实例二十六)

目录 1.认识Python 2.环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3.文件上传 3.1 代码构思 3.2 服务端代码 3.3 客户端代码 3.4 运行结果 4.总结 1.认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具…

C++图网结构算法

目录 一.迪杰斯特拉算法&#xff08;dijkstra&#xff09; 1.实现原理&#xff1a; 2.代码实现&#xff1a; 3.例题&#xff1a; 二.spfa算法&#xff1a; 1.实现原理&#xff1a; 2.代码实现&#xff1a; 3.例题&#xff1a; 三.贝尔曼福特&#xff08;bellman_ford&…

【嵌入式硬件】快衰减和慢衰减

1.引语 在使用直流有刷电机驱动芯片A4950时,这款芯片采用的是PWM控制方式,我发现他的正转、反转有两种控制方式,分别是快衰减和慢衰减。 2.理解 慢衰减:相当于加在电机(感性原件)两端电压消失,将电机两端正负短接。 快衰减:相当于加在电机(感性原件)两端电压消失,将电机…

AcWing-差分矩阵

insert函数影响范围&#xff0c;在b差分数组这样操作影响到是a里面的&#xff0c;所以下图的矩阵表示的是a数组 b[x1][y1]c;会导致a里面仅绿色范围的a[i][j]c b[x1][y21]-c;会导致a里面仅黄色范围的a[i][j]-c b[x21][y1]-c;会导致a里面仅蓝色范围的a[i][j]-c b[x21][y21]c;会导…

什么情况下的网站要使用CDN加速呢?

CDN的全称是Content Delivery Network&#xff0c;即内容分发网络。 CDN的通俗理解就是网站加速&#xff0c;CPU均衡负载&#xff0c;可以解决跨运营商&#xff0c;跨地区&#xff0c;服务器负载能力过低&#xff0c;带宽过少等带来的网站打开速度慢等问题。 原理就是在客户端…

Java聚合快递系统对接云洋系统快递小程序系统源码

&#x1f680; "聚合快递系统"无缝对接云洋系统&#xff0c;快递小程序新体验&#xff01;&#x1f4e6; &#x1f69a; 开篇&#xff1a;快递管理新纪元&#xff0c;一键接入云洋系统&#xff01; 你是否还在为繁琐的快递管理而头疼&#xff1f;多个快递公司账号切…

新手必备:iPhone新机官网验机流程详解

目录 一、准备工作 二、外包装检查 三、序列号查询 四、开箱验机 五、开机验机 六、功能检测 七、售后服务验证 八、总结 一、准备工作 检查包裹&#xff1a;确保快递包裹完好无损。准备录像设备&#xff1a;使用另一台设备录制整个验机过程&#xff0c;以防日后发生纠…

无人机公司销售需要什么资质

国家民航局于2024年1月1日实施了《无人驾驶航空器飞行管理暂行条例》&#xff0c;根据这个管理条例里面的 第十一条 使用除微型以外的民用无人驾驶航空器从事飞行活动的单位应当具备下列条件&#xff0c;并向国务院民用航空主管部门或者地区民用航空管理机构申请取得民用无人驾…

从社区走向产业,让数据价值的流动像自来水一样即开即用|隐语开源两周年特别活动

“隐语”是开源的可信隐私计算框架&#xff0c;内置 MPC、TEE、同态等多种密态计算虚拟设备供灵活选择&#xff0c;提供丰富的联邦学习算法和差分隐私机制 开源项目 github.com/secretflow gitee.com/secretflow 数据要素市场规模指数级增长&#xff0c;数据要素逐渐流向千行…

北大延毕硕士×INFJ | 我解脱了

前言 拿了双证&#xff0c;我终于能静下心来复盘一下我延毕一年的经历了。 给后面也许有相同困境的朋友们做个参考或者心理疏导作用。 延毕的原因 我延毕的主要原因是论文研三的时候论文没有完成&#xff0c;我们专业的论文一般是6个月全身心投入可以完成。我这个人是典型的…