LeetCode第100题----相同的树

本文将较详细的叙述LeetCode第100题的解题思路和解题步骤,希望帮到大家。


前言

二叉树是重中之重,很多题目都以二叉树立足。今天我将分享LeetCode第100题,该题在力扣官方评级为简单。


本人才疏学浅,如有错误请指正。

一、题目描述

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

示例:
截图不易,三联鼓励

截图不易,三联鼓励
截图不易,三联鼓励

二、解题思想和解题步骤

1.解题思想

读完题后,第一个想到的解题方法是利用前、中、后、层序遍历,如果遍历结果相等,那么两树相同,若不相等,则不同。我也想过只去进行先序遍历或者中序遍历会不会得到我们想要的结果,答案是否定的,下面举例进行说明:
制图不易,三联鼓励
由上图可知利用单一的前、中、后、层序遍历是不能判断的,但是利用两个甚至三个遍历的时间和空间复杂度太大,所以我们不使用此方法。

思考后可以发现,该问题可以利用递归进行解答,也就是我们平常所说的DFS法。

2、解题步骤

对于此题,我们的解题步骤为:

1. 特殊情况处理
如果两个节点都为空,则返回True;
如果一个节点为空,另一个不为空,则返回False;
如果两个节点不相同,则返回False。

2. 一般情况处理
如果两个节点相同,则比较左子树和右子树是否相同,进行递归求解。

三、代码实现

Python代码:

class Solution:
    def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
        if not p and not q:
            return True
        elif not p or not q:
            return False
        elif p.val != q.val:
            return False
        else:
            return self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)

C++代码:

class Solution {
public:
    bool isSameTree(TreeNode* p, TreeNode* q) {
        if (p == nullptr && q == nullptr) {
            return true;
        } else if (p == nullptr || q == nullptr) {
            return false;
        } else if (p->val != q->val) {
            return false;
        } else {
            return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
        }
    }
};

Java代码:文章地址

class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        if(p == null && q == null){
            return true;
        }else if(p == null || q == null){
            return false;
        }else if(p.val == q.val){
            return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
        }
        return false;
}

C语言代码:文章地址

bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
    if (p == NULL && q == NULL) {
        return true;
    } else if (p == NULL || q == NULL) {
        return false;
    } else if (p->val != q->val) {
        return false;
    } else {
        return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
    }
}

总结

本题分享到此结束,若有错误,请联系本人进行更改。最后,感谢我家莫莫的耐心等待与陪伴。

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值