二叉树 —— OJ题目详解

1.二叉树的前序遍历

二叉树的前序遍历比较简单,但是在力扣上写这个接口需要注意几个点:

int* preorderTraversal(struct TreeNode* root, int* returnSize) {}
  • preorderTraversal 的返回值是动态开辟的数组,里面存放的是前序遍历的顺序
  • int* returnSize 这个参数记录的是遍历到的数据个数,因为函数的返回值只能有一个,所以我们通它来记录,当用户需要数据个数时,直接查看该指针变量即可

 代码:


int TreeSize(struct TreeNode* root){if(root == NULL)return 0;return TreeSize(root->left) + TreeSize(root->right) + 1;
}void _preOrder(struct TreeNode* root, int* a,int* i){if(root == NULL)return;a[*i] = root->val; //记录当前节点,到数组中(*i)++;            //数组下标+1_preOrder(root->left,a,i);  //接着遍历左子树_preOrder(root->right,a,i); //然后遍历右子树 }//returensize是记录数组的元素个数,我们要返回给用户的是遍历数的数组
int* preorderTraversal(struct TreeNode* root, int* returnSize) {*returnSize = TreeSize(root);//遍历树,得到数据个数int* a = (int*)malloc(sizeof(int) * (*returnSize));//动态开辟数组空间int i = 0;_preOrder(root ,a,&i);//前序遍历return a;}

2.检查两棵树是否相同

思路: 

利用前序遍历,先比较当前节点是否相同,紧接着比较左子树与右子树

代码:

bool isSameTree(struct TreeNode* p, struct TreeNode* q) {if(p == NULL && q == NULL) //如果pq都为NULL,返回真return true;if(p == NULL || q == NULL)  //代码到这里,只有2种可能,1.pq其中一个为NULL,2两个都不为NULL//如果其中一个为NULL,说明另一个一定不是NULL,则pq不相等,不用return false;          //比较了,返回falseif(p->val != q->val)  // 代码到这,说明pq都不为NULL,直接比较即可return false;    //比较qp相等没有用意义,要看它们不相等,可以直接出结果return isSameTree(q->left,p->left) //在比较左右子树,右子树&& isSameTree(q->right,p->right);
}

3.对称二叉树

 思路:

观察示例一:一颗对称的二叉树,我的左子树根节点 == 你的右子树根节点、我的右子树根节点 == 你的左子树根节点。有一个地方不符合此规则,则此树不是对称二叉树

所以示例一是一颗对称二叉树,我们代码则使用递归的方法,先比较当前两棵树的根节点是否相同,在比较这两颗树的左右子树是否对称

代码:

bool _isSymmetric(struct TreeNode* q,struct TreeNode* p)
{//先比较当前两颗子树的根节点是都相同if(p == NULL && q == NULL) return true;if(p == NULL || q == NULL)  //代码到这里,只有2种可能,1.pq其中一个为NULL,2两个都不为NULLreturn false;if(p->val != q->val)// 比较根节点是否相同return false;return _isSymmetric(q->left,p->right)   //q节点的左子树,与p节点的右子树比&& _isSymmetric(q->right,p->left);     //q节点的右子树,与p节点的左子树比
}
bool isSymmetric(struct TreeNode* root) {return _isSymmetric(root->left,root->right);
}

4.另一棵树的子树

思路:

题目给出了root树与subRoot树,让我们看看sybRoot树是否是root树中的一个子树

 1.那么我们首先要做的是:如何找出root树的所有子树?

其实这个很简单,我们只需要遍历到root树的每一个节点就相当于找到了root树的所有子树,因为每一个节点都是某棵树的根节点,通过根节点自然得到了一节树

2.找到了所有子树之后我们要做的自然依次与subRoot树比较,看有没有相同的树了

我们前面已经写过检查两颗树是否相同,直接移植过来就可以

代码:

bool isSameTree(struct TreeNode* p, struct TreeNode* q) {if(p == NULL && q == NULL) return true;if(p == NULL || q == NULL)  return false;if(p->val != q->val)return false;   return isSameTree(q->left,p->left)&& isSameTree(q->right,p->right);
}bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){if(root == NULL)//subRoot树上的节点数量范围是[1, 1000],所以当遍历到的子树为NULL时返回falsereturn false;//当某一个子树的根节点与subRoot根节点相同时,开始比较两棵树是否相同//当两颗树相同则直接出结果,不用接着去找了,返回ture if(root->val == subRoot->val &&isSameTree(root,subRoot))return true;//接着去遍历左子树与右子树,一边找到了就不用再继续找了,整体就是前序遍历的去遍历每一颗子树return isSubtree(root->left,subRoot) || isSubtree(root->right,subRoot);
}

5.二叉树的构建及遍历

利用,用户输入的数组先构建一颗二叉树,在进行中序遍历即可 

代码:

#include <stdio.h>
#include<stdlib.h>
typedef char BTDataType;typedef struct BinaryTreeNode {BTDataType _data;struct BinaryTreeNode* _left;struct BinaryTreeNode* _right;
} BTNode;BTNode* BuyNode(BTDataType x) {BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));if (newnode == NULL) {perror("Buynode()::malloc()");return newnode;}newnode->_data = x;newnode->_left = NULL;newnode->_right = NULL;return newnode;
}// 二叉树中序遍历
void BinaryTreeInOrder(BTNode* root) {if (root == NULL) {return;}BinaryTreeInOrder(root->_left);//左子树printf("%c ", root->_data);//根节点BinaryTreeInOrder(root->_right);
}// 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树
BTNode* BinaryTreeCreate(BTDataType* a,int* pi) {//根,左子树,右子树if (a[(*pi)] == '#') {(*pi)++;return NULL;}BTNode* newnode = BuyNode(a[(*pi)++]);newnode->_left = BinaryTreeCreate(a,pi);newnode->_right  = BinaryTreeCreate(a,pi);return newnode;
}int main() {char arr[101];scanf("%s",arr);int count = 0;BTNode* tree = BinaryTreeCreate(arr,&count);   //构建二叉树BinaryTreeInOrder(tree);                      //中序遍历二叉树return 0;
}

6.翻转二叉树

思路: 

依旧是使用递归,先翻转左子树,在翻转右子树。由于翻转后,左右子树的根节点没有动,最后在将根节点翻转即可完成当前树的翻转

代码:

void _invertTree(struct TreeNode* root)
{if(root == NULL)return;_invertTree(root->left);   //翻转左子树_invertTree(root->right);  //翻转右子树//在将自己左右子树的根节点交换,即可完成翻转struct TreeNode* temp = root->left;root->left = root->right;root->right = temp;
}
struct TreeNode* invertTree(struct TreeNode* root) {_invertTree(root);return root;
}

7.平衡二叉树

平衡二叉树: 每个节点的左右子树的深度相差不超过1

思路: 

遍历二叉树的每一个节点,算它们的高度差超过1吗,超过就不是平衡二叉树

代码:

int TreeHight(struct TreeNode* root)//求高度
{if(root == NULL)return 0;int left = TreeHight(root->left);int right = TreeHight(root->right);return left > right ? left + 1 : right + 1;
}//走前序遍历,依次遍历每个节点,并求节点左子树与右子树的高度差 >1?
bool isBalanced(struct TreeNode* root) {if(root == NULL)return true;//比较当前节点左右子树高度差int left = TreeHight(root->left);   int right = TreeHight(root->right);if(abs(left-right) > 1)return false;if(isBalanced(root->left) == 0)  //遍历左子树return false;if(isBalanced(root->right) == 0)  //遍历右子树return false;return true; //代码到这说明它就是一颗平衡二叉树
}

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

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

相关文章

【Linux取经之路】Linux常见指令

目录 基本指令 常见指令 1&#xff09;ls —— 对于目录&#xff0c;列出该目录下的所有子目录和文件&#xff1b;对于文件&#xff0c;将列出文件名及其他信息 2&#xff09;pwd —— 显示当前所在的目录 ​编辑 3&#xff09;cd —— 切换到指定路径下 4&#xff09;t…

itextpdf字体选择

itextpdf 版本7.2.5 itextpdf-html2pdf 版本4.0.5 这里讲的是通过html转pdf&#xff0c;在html2pdf中是通过html中font-family样式来确定字体的&#xff0c;那已知font-family的情况&#xff0c;怎么确定pdf中实际用的字体&#xff0c;大致分为两步&#xff1a; 1、通过font…

识别 TON 生态系统中前10种加密资产,以bitget 钱包为例

元描述&#xff1a;想要找到下一个 100 倍加密货币投资&#xff1f;请密切关注这篇文章&#xff1b;它揭示了所有可能很快变得非常有价值的 TON 网络宝石。 由 Telegram 提供支持的 TON&#xff08;开放网络&#xff09;生态系统正在蓬勃发展&#xff01;这是一个充满激动人心的…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【25】【分布式事务】

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【25】【分布式事务】 本地事务事务的基本性质事务的隔离级别&#xff08;下面四个越往下&#xff0c;隔离级 别越高&#xff0c;并发能力越差&#xff09;事务的传播行为&#xff08;是否…

【Hive SQL 每日一题】找出各个商品销售额的中位数

文章目录 测试数据需求说明需求实现方法1 —— 升序计算法方法2 —— 正反排序法 补充 测试数据 -- 创建 orders 表 DROP TABLE IF EXISTS orders; CREATE TABLE orders (order_id INT,product_id INT,order_date STRING,amount DOUBLE );-- 插入 orders 数据 INSERT INTO ord…

软件工程课设——成绩管理系统

软件工程课设——成绩管理系统 该文档是软件工程课程设计&#xff0c;成绩管理子系统的开发模块仓库。 功能分析 从面向的用户分&#xff0c;成绩管理子系统主要面向三类用户&#xff0c;即至少需要满足这三类用户的需求&#xff1a; 学生&#xff1a;学生是成绩管理系统的…

深入理解 Git Reset 的三种模式及其使用场景

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Android ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 1. --soft 模式 2. --mixed 模式&#xff08;默认&#xff09; 3. --hard 模式 总结 结语 我的其他博客 前言 在日常的开发…

机器学习-1:人工智能、机器学习和深度学习的关系

人工智能&#xff08;AI&#xff09; 简单理解&#xff0c;任何一种事物只要具备了一定的智能就可以把它归类为人工智能。 官方定义&#xff1a;"AI is the field that sdudies the synthesis and analysis of computational agents that act intelligently." 其中&a…

安卓学习中遇到的问题【bug】

安卓学习中遇到的问题 1Gradle下载慢怎么办&#xff1f; Gradle下载慢怎么办&#xff1f; distributionUrlhttps://mirrors.cloud.tencent.com/gradle/gradle-7.5-bin.zip 2 Could not resolve all files for configuration ‘:classpath‘. &#xff1e; Could not resolv…

uniapp-vue3-vite 搭建小程序、H5 项目模板

uniapp-vue3-vite 搭建小程序、H5 项目模板 特色准备拉取默认UniApp模板安装依赖启动项目测试结果 配置自动化导入安装依赖在vite.config.js中配置 引入 prerttier eslint stylelint.editorconfig.prettierrc.cjs.eslintrc.cjs.stylelintrc.cjs 引入 husky lint-staged com…

处理在 electron 中使用开启了懒加载的 el-image 后,窗口最大化或窗口尺寸变化后图片无法显示的问题

文章目录 1、问题描述2、详情动图3、解决思路4、解决方案5、效果展示 1、问题描述 在 electron 中使用 el-image 时&#xff0c;开启了懒加载后&#xff0c;发现只有当窗口滚动后&#xff0c;图片才会显示&#xff0c;即便图片已经处于窗口的可视区域。当拖动窗口使其尺寸变大…

基于JAVA+SpringBoot+Vue+uniapp+协同过滤算法+爬虫+AI的减肥小程序

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 小程序用户登录&#…

前端开发体系+html文件详解

目录 html骨架 body主体内基本元素 基本元素 超文本&#xff08;超链接跳转&#xff09; 锚点 图片标签 列表标签 表格标签 框架标签&#xff08;窗口标签&#xff09; 音频标签 视频标签 VScode编译器 输入框 字体样式 实例展示&#xff1a; 首先简要介绍前端的整…

在VS2017下FFmpeg+SDL编写最简单的视频播放器

1.下载ShiftMediaProject/FFmpeg 2.下载SDL2 3.新建VC控制台应用 3.配置include和lib 4.把FFmpeg和SDL的dll 复制到工程Debug目录下&#xff0c;并设置调试命令 5.复制一下mp4视频到工程Debug目录下&#xff08;复制一份到*.vcxproj同一目录&#xff0c;用于调试&#xff09; 6…

python中的re模块--正则表达式

正则表达式&#xff0c;又称规则表达式。&#xff08;英语&#xff1a;Regular Expression&#xff0c;在代码中常简写为regex、regexp或RE&#xff09;&#xff0c;计算机科 学的一个概念。正则表达式通常被用来检索、替换那些符合某个模 式(规则)的文本 re模块作用 通过使用…

JVM 内存介绍

本文主要介绍&#xff1a; JVM 内存分哪几个区&#xff0c;每个区的作用是什么 备注: 橙色:堆 和 方法区 &#xff0c;属于jvm公有部分,可以进行调优 灰色:java栈,本地方法栈和计数器 属于jvm的私有部分,不可进行调优 一个对象从创建到被回收的过程是怎样的? Personpnew Perso…

【HarmonyOS】HarmonyOS NEXT学习日记:一、创建和运行一个页面

【HarmonyOS】HarmonyOS NEXT学习日记&#xff1a;一 DevEco Studio下载与安装 直接到官网的下载地址下载即可 正常下载、解压、安装完成后 正常来说不会有项目&#xff0c;并且是英文界面。 需要汉化的话可以按照下面的步骤设置插件 选择customize里的 all setting 进入…

macOS Sequoia 15(Macos15系统)v15.0 Beta 3发布 macOS Sequoia 15 功能预览

macOS Sequoia 15 功能预览 犀利一如 Mac macOS Sequoia 15(Macos15系统)v15.0 Beta 3测试版本下载安装 连续互通 你的 Mac 上&#xff0c;iPhone 用起来。 有了 iPhone 镜像功能&#xff0c;在 Mac 上就能看到 iPhone 屏幕画面&#xff0c;还能直接进行操控&#xff0c;不拿…

uniapp 实现上传文件的功能

上传单个文件 <script setup>const handleUploadClick () > {console.log("上传文件")uni.chooseImage({success: (chooseImageRes) > {const tempFilePaths chooseImageRes.tempFilePaths;console.log("用户选择的图片&#xff1a;", temp…

誉天教育与武汉晴川学院携手开展鸿蒙实训营,共筑鸿蒙生态新篇章!

在数字经济蓬勃发展的今天&#xff0c;鸿蒙系统作为华为自主研发的操作系统&#xff0c;正逐步构建起一个开放、协同、共赢的生态体系。为了进一步推动鸿蒙生态的繁荣发展&#xff0c;培养更多具备鸿蒙原生应用开发能力的专业人才&#xff0c;誉天教育与武汉晴川学院强强联合&a…