🔥个人主页:@草莓熊Lotso
🎬作者简介:C++研发方向学习者
📖个人专栏: 《C语言》 《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》
⭐️人生格言:生活是默默的坚持,毅力是永久的享受。
前言:在之前的C语言刷题集中我们刷了很多IO类型的基础编程题,但是随着数据结构往后的学习以及企业面试的要求,我们还需要对接口型的题目进行练习,博主在这里准备了新的《LeetCode刷题指南》专栏给大家分享一些我自己在力扣上面写过的题目,提供一些我的解题思路。个人实力有限,欢迎大家补充和指正。
目录
一.对称二叉树
题目描述:
题目示例:
思路: 递归
解题过程:
1.判断当前树的左右子树是不是相同的树
2.调用相同的树的代码,具体操作在之前的题目中讲过
3.但是要注意相同的树判断代码里这里和之前的不太一样
具体过程如图所示:
复杂度:
- 时间复杂度: O(n)
- 空间复杂度: O(n)
代码实现:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
typedef struct TreeNode TreeNode;
bool isSameTree(TreeNode*p,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->right)&&isSameTree(p->right,q->left);
}
bool isSymmetric(struct TreeNode* root) {
return isSameTree(root->left,root->right);
}
二.另一颗树的子树
题目描述:
题目示例:
思路: 递归
解题过程:
1.在isSubtree函数里,如果root为空直接返回false
2.如果root不为空,先拿当前root和Subtree比较,看是否是相同的树(这里调用之前写过的相同的树的函数,没有需要修改的地方)
3.如果不为空也不是相同的树,则继续传左孩子或者右孩子递归,有任意一个符合isSubtree就可以
具有操作如图所示:
复杂度:
- 时间复杂度: O(n)
- 空间复杂度: O(n)
代码实现:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
//p和q都为空
if(p==NULL && q==NULL)
{
return true;
}
//p和q只有一个为空,前面提前判断过全为空处理了
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) {
//如果root为空则返回false
if(root==NULL)
{
return false;
}
//如果是相等的树就返回true
if(isSameTree(root,subRoot))
{
return true;
}
//如果这次不相等,就传左右孩子节点。左右子树任一有一个和subRoot相同就可以
return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);
}
往期回顾:
【LeetCode刷题指南】--二叉树的前序遍历,二叉树的中序遍历
结语:本篇文章就到此结束了,《LetetCode刷题指南》中的题目比起之间的C语言刷题集中的题目,肯定会更加复杂一些。而且题目形式也不一样,大家需要注意一下。如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持。