本文将较详细的叙述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);
}
}
总结
本题分享到此结束,若有错误,请联系本人进行更改。最后,感谢我家莫莫的耐心等待与陪伴。