L15.【LeetCode笔记】相同的树

目录

1.题目

代码模板

2.分析

通过合理的if判断分类讨论两个根节点

1.首先,p和q都为NULL的情况最好排除

2.排除了两个都为NULL的情况,剩下的情况:1.其中一个为NULL;2.两个都不为NULL

写法1

写法2

3.只剩下最后一种情况:p和q都不为NULL

3.代码

提交结果


1.题目

https://leetcode.cn/problems/same-tree/

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

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

示例 1:

复制代码
输入:p = [1,2,3], q = [1,2,3]
输出:true

示例 2:

复制代码
输入:p = [1,2], q = [1,null,2]
输出:false

示例 3:

复制代码
输入:p = [1,2,1], q = [1,1,2]
输出:false

提示:

  • 两棵树上的节点数目都在范围 [0, 100]
  • -10^4 <= Node.val <= 10^4

代码模板

cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
bool isSameTree(struct TreeNode* p, struct TreeNode* q) 
{
}

2.分析

按根-->左子树-->右子树的顺序比较

分而治之的思想:根节点相同,递归比其的左子树节点和右子树节点;若两个子树的节点相同,分别递归比其的左子树节点和右子树节点......

根节点p和q有多种可能

|---|------|--------|--------|--------|
| | 情况1 | 情况2 | 情况3 | 情况4 |
| p | NULL | !=NULL | NULL | !=NULL |
| q | NULL | NULL | !=NULL | !=NULL |

通过合理的if判断分类讨论两个根节点

1.首先,p和q都为NULL的情况最好排除

cpp 复制代码
if (p==NULL && q==NULL)
        return true;

2.排除了两个都为NULL的情况,剩下的情况:1.其中一个为NULL;2.两个都不为NULL

两个都不为NULL的情况是要递归处理的,因此先排除其中一个为NULL的情况

写法1
cpp 复制代码
    if (p==NULL|| q==NULL)
        return false;
写法2
cpp 复制代码
    if ((p==NULL)+(q==NULL)==1)
        return false;

3.只剩下最后一种情况:p和q都不为NULL

比较p->val和q->val是否相同

注意:写成if (p->val==q->val)没有什么意义,做不了任何事,判断如果不相等则返回false,否则递归比较左右子树的节点

cpp 复制代码
    if (p->val!=q->val)
        return false;

    //执行到此处,说明p->val和q->val相等
    return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);

3.代码

cpp 复制代码
bool isSameTree(struct TreeNode* p, struct TreeNode* q) 
{
    if (p==NULL && q==NULL)
        return true;

     //若能执行到此,排除了两个都为NULL的情况,剩下的情况:1.其中一个为NULL;2.两个都不为NULL
    if ((p==NULL)+(q==NULL)==1)
        return false;

    //只剩下最后一种情况:p和q都不为NULL
    if (p->val!=q->val)
        return false;

    //执行到此处,说明p->val和q->val相等
    return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}

提交结果

相关推荐
会周易的程序员5 分钟前
给 PLC 写一个字节码虚拟机:STVM 虚拟机架构设计
开发语言·c++·虚拟机·软plc·iec61131·stvm
机器视觉知识推荐、就业指导10 分钟前
为什么老说“纯 Qt 没啥就业市场”?
开发语言·qt
telepan11 分钟前
Qt 开发避坑与性能指南:如何优雅、安全地定义全局常量字符串?
开发语言·qt
m0_6952514928 分钟前
Qt MaintenanceTool 使用国内镜像加速下载(超详细教程)
开发语言·qt
是隼人1 小时前
buuctf-pwn xdctf2015_pwn200题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
en.en..1 小时前
C语言 标准输入 / 输出缓冲区
算法
jike_20261 小时前
iPhone采访录音同时拍现场照片的APP:图片音频同步记录实测
笔记·智能手机·音视频·语音识别
大衛說2 小时前
《Python 从入门到精通》系列总览与学习路线
开发语言·python·学习
吃好睡好便好3 小时前
查找函数的使用
学习·算法·matlab·生活·查找函数
学习星球3 小时前
单调栈——从“找下一个更大的“到柱状图中的最大矩形
数据库·c++·算法·leetcode·xcode