刷爆leetcode第十期

题目一 相同的树

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

首先我们要来判断下它们的根是否相等

根相等的话是否它们的左子树相等

是否它们的右子树相等

一直到子树为空为止

大家仔细思考下这个思路对不对

接下来我们开始敲代码

首先我们想极端一点的情况

如果这个俩空指针

说明这里肯定不用判断了 返回ture就行

如果说有一个空指针 一个不为空指针的话 那么肯定是不相同的返回假就可以

接下来如果值相等 我们能判断它们相同嘛 显然不可以

所以说我们这里直接上两个不同 返回假

之后我们再判断它的左子树右子树

整体代码如下

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

    return isSameTree(root->left,root->right);
}

这里我们要注意的是 要转换成两个子树问题才可以做

而子树问题需要再创建一个递归函数 可能是这一题的难点之一

还有一个难点就是要观察结构、

题目三 另一个树的子树

给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。

二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/subtree-of-another-tree

我们这里只需要遍历一遍root 并且将root中的每一个节点和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(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);
}

 以上便是本文所有内容,如有错误请各位大佬不吝赐教,感谢留言 

在 PyCharm 中使用 LeetCode 插件进行题是一个高效的方式,尤其适合已经熟悉 PyCharm 开发环境的开发者。以下是详细的使用和配置步骤: ### 安装 LeetCode 插件 1. 打开 PyCharm,依次点击 `File` → `Settings` → `Plugins`。 2. 在插件市场(Marketplace)中搜索 `leetcode`。 3. 找到名为 **LeetCode Editor** 的插件,点击 `Install` 进行安装。 4. 安装过程中会提示接受许可协议,点击 `Accept` 继续。 5. 安装完成后,重启 PyCharm 以使插件生效。 ### 配置 LeetCode 插件 1. 重启 PyCharm 后,在右侧工具栏中找到 **LeetCode** 面板。 2. 点击面板中的 **Sign In**,输入你的 LeetCode 账号和密码进行登录。 3. 登录成功后,LeetCode 面板会显示题目列表,支持按照标签、难度等分类筛选题目。 4. 双击某道题目,即可在编辑器中打开该题目的模板代码。题目描述会显示在代码上方的注释中,与网页版类似,但不包含图示。 ### 编写与调试代码 1. 插件提供的代码模板中通常只包含函数体,没有完整的输入输出逻辑。 2. 可以直接在插件提供的文件中编写代码,但为了更好的调试体验,建议将函数体复制到自己的工程文件中进行开发和测试。 3. 编写完成后,可以使用插件中的运行功能测试代码逻辑,插件会自动调用 LeetCode 的测试用例并返回结果[^3]。 ### 常见注意事项 - LeetCode 插件中编写的代码不需要包含 `main()` 函数或完整的输入输出处理,只需实现题目要求的函数即可。 - 如果使用 C++,注意 `sort` 函数的第三个参数 `cmp` 必须声明为 `static`,否则会导致编译错误。 - 对于涉及容器(如 `vector`)的问题,若不在类内使用,建议在函数内部进行初始化,避免全局变量带来的副作用。 - 若遇到 `AddressSanitizer: DEADLYSIGNAL` 错误,通常是因为访问了非法内存地址,检查数组越界或指针操作是否正确[^2]。 ### 示例代码模板 以下是一个 LeetCode 插件中常见的代码模板示例: ```python class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: # 在此处编写你的解法 pass ``` 在编写完成后,可以直接在插件中点击运行按钮进行测试,或者将代码复制到本地项目中进行调试。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值