当前位置: 首页 > news >正文

【OJ】二叉树相关OJ题

✨✨欢迎大家来到Celia的博客✨✨

🎉🎉创作不易,请点赞关注,多多支持哦🎉🎉

所属专栏:OJ题

个人主页:Celia's blog~

目录

​编辑

单值二叉树

题目描述  OJ-单值二叉树

解题思路

代码实现

二叉树的最大深度

题目描述  OJ-二叉树的最大深度

解题思路

代码实现

检查两棵树是否相同

题目描述 OJ-相同的树

解题思路

代码实现

对称二叉树 

题目描述   OJ-对称二叉树

解题思路

代码实现

另一颗树的子树

题目描述 OJ-另一颗树的子树

解题思路

代码实现

翻转二叉树

题目描述 OJ-翻转二叉树

解题思路

代码实现

平衡二叉树

题目描述 OJ-平衡二叉树

解题思路

代码实现

单值二叉树

  • 题目描述  OJ-单值二叉树

  • 如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。
  • 只有给定的树是单值二叉树时,才返回 true;否则返回 false

  • 解题思路

本题的核心是判断左右子树的val的值是否和主干的val相等。

  1. 若节点为空,则返回true。
  2. 若不相等,返回false。
  3. 如果这两个条件都不满足,则递归判断左右子树。

该题调用的函数参数只有一个二叉树节点指针。为了方便起见,可以额外写一个子函数来进行递归,子函数的参数为二叉树节点指针root和该节点的值val

返回true的情况示例
​​​​​(​​绿色数字为执行顺序)
返回false的情况示例
​​​​​(​​绿色数字执行顺序)
  • 代码实现

bool _isUnivalTree(struct TreeNode* root,int val)
{if(root == NULL)return true;if(root->val != val)return false;return _isUnivalTree(root->left,val) && _isUnivalTree(root->right,val);
}
bool isUnivalTree(struct TreeNode* root)//系统调用的函数
{return _isUnivalTree(root,root->val);
}

二叉树的最大深度

  • 题目描述  OJ-二叉树的最大深度

  • 给定一个二叉树 root ,返回其最大深度。
  • 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

  • 解题思路

本题的关键在于,该树的深度为左右子树中最大的深度

  1. 如果传入的节点为空,则返回0。
  2. 如果节点不为空,则递归计算左右两个子树的深度,并且定义两个整型变量记录下来
  3. 最后返回左右子树深度中值最大的一个。
递归遍历求深度示例
(​​绿色数字执行顺序)
  • 代码实现

int maxDepth(struct TreeNode* root) {if(root == NULL)return 0;int l = maxDepth(root->left);int r = maxDepth(root->right);return l > r ? l + 1 :r + 1;
}

在这里要注意一定要用两个变量接收左右子树的深度,不可以将递归函数写在三目运算符中:

return maxDepth(root->left) > maxDepth(root->right) ? maxDepth(root->left) + 1 : rmaxDepth(root->right) + 1;

上面的写法会导致过多的重复运算,严重拖慢了运行时间。 

检查两棵树是否相同

  • 题目描述 OJ-相同的树

  • 给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
  • 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

  • 解题思路

  1. 如果传入的节点都为空,则返回true。
  2. 如果只有其中一个为空,另一个不为空,则返回false。
  3. 如果传入的节点都不为空,但是这两颗树当前节点值不同,返回false。
  4. 递归遍历两个左右子树,左子树和左子树比较,右子树和右子树比较,返回两个递归逻辑与的结果。
  • 代码实现

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

对称二叉树 

  • 题目描述   OJ-对称二叉树

  • 给你一个二叉树的根节点 root , 检查它是否轴对称。

  • 解题思路

这道题和  OJ-相同的树 思路是一样的,唯一需要改变的地方为相同的树是相同方向的树进行比较,而本题是不同方向的树进行比较。

  • 代码实现

bool _isSymmetric(struct TreeNode* r1,struct TreeNode* r2)
{if(r1 == NULL && r2 == NULL)return true;if(r1 == NULL || r2 == NULL)return false;if(r1->val != r2->val)return false;return _isSymmetric(r1->right,r2->left) && _isSymmetric(r1->left,r2->right);
}
bool isSymmetric(struct TreeNode* root)
{return _isSymmetric(root->left,root->right);
}

另一颗树的子树

  • 题目描述 OJ-另一颗树的子树

  • 给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。
  • 二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。

  • 解题思路

  1. 本题提供的subRoot树一定为非空,那么如果传入的root节点为空,则一定不包含子树,返回false。
  2. 先判断subRoot树和root树的当前节点的值是否相同,若相同,检查以当前节点为根节点的树是否为subRoot树,如果是,返回true。
  3. 以左右子树为根节点递归左右子树,返回它们逻辑或的结果。(左右只要含有子树就符合题意)
  • 代码实现

本题用到了  OJ-相同的树 的代码。

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(p->left,q->left) && isSameTree(p->right,q->right);
}
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot)
{if(root == NULL)return false;if(root->val == subRoot->val && isSameTree(root,subRoot))return true;return isSubtree(root->left,subRoot) || isSubtree(root->right,subRoot);}

翻转二叉树

  • 题目描述 OJ-翻转二叉树

  • 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

  • 解题思路

  1. 如果传入的节点为空,返回NULL。
  2. 如果传入的节点非空,则交换左右子树节点的值。
  3. 递归调用左右子树。
  4. 返回根节点。
  • 代码实现

struct TreeNode* invertTree(struct TreeNode* root)
{if(root == NULL)return NULL;struct TreeNode* tmp = root->right;root->right = root->left;root->left = tmp;invertTree(root->left);invertTree(root->right);return root; 
}

平衡二叉树

  • 题目描述 OJ-平衡二叉树

  • 给定一个二叉树,判断它是否是 平衡二叉树。
  • 平衡二叉树 是指该树所有节点的左右子树的深度相差不超过 1。

  • 解题思路

  1. 如果传入的节点为空,返回true。
  2. 定义两个变量,记录当前节点的左右子树的深度,并求出左右子树相差的绝对值。
  3. 若绝对值大于1,返回false。
  4. 递归调用左右子树,返回它们逻辑与的结果(左右两边都必须平衡)。
  • 代码实现

本题用到了  OJ-二叉树的最大深度 的代码。

int TreeHeight(struct TreeNode* root)
{if(root == NULL)return 0;int r = TreeHeight(root->left);int r1 = TreeHeight(root->right);return r1 > r ? r1 + 1 : r + 1;
}
bool isBalanced(struct TreeNode* root)
{if(root == NULL)return true;int leftHeight = TreeHeight(root->left);int rightHeight = TreeHeight(root->right);int size = abs(leftHeight - rightHeight);//求绝对值if(size > 1)return false;return isBalanced(root->left) && isBalanced(root->right);
}
http://www.lryc.cn/news/405344.html

相关文章:

  • Blender中保存透明图片
  • MySQL之索引优化
  • Spring Boot 与 Amazon S3:快速上传与下载文件的完整指南
  • 细节剖析:HTTP与HTTPS在安全性、性能等方面的不同!
  • MySQL面试篇章——MySQL索引
  • WSL 2 Oracle Linux 9.1 安装配置
  • MySQL日志文件详解
  • MySQL零散拾遗(三)
  • 鸿蒙 使用 Refresh 实现下拉刷新
  • 【JavaScript 算法】图的遍历:理解图的结构
  • Ubuntu 中默认的 root 用户密码
  • Rust编程-高级特性
  • JavaRegexImprove练习(1) (2024.7.22)
  • 基于YOLO模型的鸟类识别系统
  • WebRTC通话原理(SDP、STUN、 TURN、 信令服务器)
  • 面试场景题系列--(1)如果系统的 QPS 突然提升 10 倍该怎么设计?--xunznux
  • 【数学建模】——前沿图与网络模型:新时代算法解析与应用
  • 视频分帧【截取图片】(YOLO目标检测【生成数据集】)
  • Redis7(二)Redis持久化双雄
  • 发布支持TS的npm包
  • 计算机视觉9 全卷积网络
  • 02.C++入门基础(下)
  • 【数据结构】探索排序的奥秘
  • 数据结构面试知识点总结3
  • python-爬虫实例(5):将进酒,杯莫停!
  • AGI 之 【Hugging Face】 的【从零训练Transformer模型】之二 [ 从零训练一个模型 ] 的简单整理
  • 十大排序的稳定性和时间复杂度
  • 【系列教程之】1、点亮一个LED灯
  • 搜维尔科技:Manus Metagloves使用精确的量子跟踪技术捕捉手部每一个细节动作
  • 机器学习 | 阿里云安全恶意程序检测