二叉树算法题实战:从遍历到子树判断

embedded/2025/3/18 10:50:34/

目录

一、引言

二、判断两棵二叉树是否相同

思路

代码实现

注意点

三、二叉树的中序遍历

思路

代码实现

注意点

四、判断一棵树是否为另一棵树的子树

思路

代码实现

注意点

​编辑

五、补充


一、引言

作者主页:共享家9527-CSDN博客

作者代码仓库:

Study in the first semester of college.c: 大一下学期学习,主要内容为个人学习过程记录

2025寒假C语言学习: 学习记录

算法学习和面试准备中,二叉树相关题目是常见且重要的类型。本文将结合小米面试真题以及经典的二叉树算法题,分享解题思路、代码实现以及一些需要注意的点。

二、判断两棵二叉树是否相同

思路

采用递归的方式,从根节点开始比较。如果两个节点都为空,说明它们相同;如果其中一个为空,另一个不为空,则不同;如果两个节点值不同,也不同。然后递归地比较它们的左子树和右子树。

代码实现


cbool 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(p->left,q->left)&&isSameTree(p->right,q->right);}

注意点

1. 递归终止条件的判断很关键,要先判断两个节点是否都为空,再判断单个节点为空的情况。

2. 比较节点值时,注意数据类型的一致性。

三、二叉树的中序遍历

思路

中序遍历的顺序是左子树、根节点、右子树。通过递归的方式,先遍历左子树,然后将根节点的值存入结果数组,最后遍历右子树。在实现时,需要计算树的节点数,以便为结果数组分配空间。

代码实现


 

cvoid midtree(struct TreeNode* root,int* arr,int* returnSize) {if(root==NULL) {return;}midtree(root->left,arr,returnSize);arr[(* returnSize)++]=root->val;midtree(root->right,arr,returnSize);}int treesize(struct TreeNode* root) {if(root==NULL) {return 0;}return treesize(root->left)+treexize(root->right)+1;}int* inorderTraversal(struct TreeNode* root, int* returnSize) {*returnSize=0;int n=treesize(root);int *arr=(int*)malloc(sizeof(int)*n);midtree(root,arr,returnSize);return arr;}

注意点

1. 递归函数中对数组和元素个数的操作要注意顺序和边界。

2. 使用 malloc 分配内存后,调用者需要负责释放内存,避免内存泄漏。

四、判断一棵树是否为另一棵树的子树

思路

先判断当前两棵树是否相同(利用前面的 isSameTree 函数),如果相同则返回 true ;如果不同,则递归地在原树的左子树和右子树中继续查找是否存在与子树相同的结构。

代码实现


cbool isSameTree(struct TreeNode* p, struct TreeNode* q) {// 同前面判断两棵树相同的代码}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);}

注意点

1. 递归调用时,要注意对空指针的处理,避免空指针异常。

2. 逻辑或 || 的使用,只要在左子树或右子树中找到匹配的子树即可。

五、补充

1. 二叉树相关题目中,递归是常用的方法,但也可以使用栈等数据结构实现非递归版本,在时间和空间复杂度上可能会有所不同。

2. 在面试中,除了写出正确的代码,还要能够清晰地阐述解题思路和时间、空间复杂度分析。

通过对这些二叉树算法题的学习和实践,我们能更好地掌握二叉树的结构和操作,为应对算法面试和实际开发中的问题打下坚实基础。


http://www.ppmy.cn/embedded/173572.html

相关文章

语音识别-FunASR-docker部署-【超简洁步骤】

FunASR介绍 FunASR是一个开源的语音识别工具包,它旨在为开发者提供一个灵活且易于使用的平台,用于开发和部署自动语音识别(ASR)系统。FunASR支持多种语言,并提供了丰富的API接口,使得集成和定制化变得更加简…

2025年【广东省安全员C证第四批(专职安全生产管理人员)】考试及广东省安全员C证第四批(专职安全生产管理人员)模拟试题

安全生产是各行各业不可忽视的重要环节,特别是在广东省这样的经济大省,安全生产的重要性更是不言而喻。为了确保安全生产管理人员具备足够的专业知识和实际操作能力,广东省定期举办安全员C证考试。本文将详细介绍2025年广东省安全员C证第四批…

在Spring Boot项目中接入DeepSeek深度求索,感觉笨笨的呢

文章目录 引言1. 什么是DeepSeek?2. 准备工作2.1 注册DeepSeek账号 3.实战演示3.1 application增加DS配置3.2 编写service3.3 编写controller3.4 编写前端界面chat.html3.5 测试 总结 引言 在当今快速发展的数据驱动时代,企业越来越重视数据的价值。为了…

K8S快速部署

前置虚拟机环境正式部署BUG解决 前置虚拟机环境 每个虚拟机配置一次就好 #关闭防火墙 systemctl stop firewalld systemctl disable firewalld #关闭 selinux sed -i s/enforcing/disabled/ /etc/selinux/config # 永久 setenforce 0 # 临时 #关闭 swap swapoff -a # 临时 vi…

08-单链表-单链表基本操作2

题目 来源 18. 链表的基本操作 思路 与上一份的最大区别就是要先判断一下要处理的k是否是合法的,也就是要先将指针能够指向k; 上一份的idx是一个全局的指针,由于链表天生就是物理位置不用连续,所以idx可以在任意位置&#xff…

使用OpenCV和MediaPipe库——抽烟检测(姿态监控)

目录 抽烟检测的运用 1. 安全监控 (1) 公共场所禁烟监管 (2) 工业安全 2. 智能城市与执法 (1) 城市违章吸烟检测 (2) 无人值守管理 3. 健康管理与医疗 (1) 吸烟习惯分析 (2) 远程监护 4. AI 监控与商业分析 (1) 保险行业 (2) 商场营销 5. 技术实现 (1) 计算机视…

微服务即时通信系统---(八)用户管理子服务

本章节,主要对项目中用户管理子服务模块进行分析、开发与测试。 功能设计 用户管理子服务,主要用于管理用户的数据,以及关于用户信息的各项操作,因此,在本模块中,用户管理子服务需要提供以下的功能性接口 用户注册用户输入 用户名(昵称) + 用户密码 进行注册。用户登录…

docker学习

基本结构 镜像(image): docker镜像可以当作一个模板,通过这个模板可以创建多个容器。 例如一个tomcat镜像>运行>容器(提供服务) 容器(container): docker利用容器技术,可以独立运行一个或一组应用(容器间相互隔离) docker…