【努力刷力扣】第十一天 --- 判断两个树是否相同
引言:
本人初次尝试写博客,希望各位看官大佬多多包容
有错误希望巨巨们提出来,我一定会及时改正,谢谢大家
在自己最好的年纪,找到了未来的目标
还有1年奋斗刷题,明年去面试实习,加油!
老样子,先看看题目要求:
DFS思想
第一步:定策略——回溯法。
如果我们正向思考,每个点都判断,走到空节点的时候,停止,这样也行,但多少有一点抽象复杂,需要对很多个判断结果进行综合,并不能得到一个确切的值。我们不妨这样,就如同上下级汇报工作情况一样,我是领导,我上面的领导要工作情况(true or false),我先看了看自己,之后分别问了左下属,又问了右下属,综合之后上报,最后最终BOSS手里拿到了一个最终结果,给了政府。综上我们采用回溯的思想,并且用后根遍历。
第二步:过程解析
First:出口设置:
任何一个良好的递归都要有明确的出口设置,当这条路径s 和 t一起走向了空,这里包含俩信息,第一他俩之前肯定各个点值都一样才能走到这里,第二既然之前都一样,又一起走到空,则还是一样子的,向上报告true。如果一个为空一个不为空,那么明显的不同,报告false。如果这点s 和 t 都不空,但是值不一样,更加明显的不同,返回false。
Second:开始后根遍历
因为并未达成出口要求,并且此时s 和 t 的值都一样,所以开始后根遍历,问它的左子树和右子树情况去了
Finally:取结果返回
因为一个点不同则整体不同,所以对左右子树结果取并然后返回即可。
代码如下:
class Solution {
public:
bool isSameTree(TreeNode* s, TreeNode* t) {//典型回溯向上报告判断字树是否相等
if (s == nullptr&&t == nullptr) {//出口设置
return true;
}
else if (s == nullptr || t == nullptr) {//出口设置
return false;
}
else {
if (s->val != t->val) {//出口设置
return false;
}
else {
return isSameTree(s->left, t->left) && isSameTree(s->right, t->right);//左右子树结果取并返回
}
}
}
};
(所有代码均已在力扣上运行无误)
经测试,该代码运行情况是(经过多次测试所得最短时间):
经计算,该算法时间复杂度为O(min(ns,nt)),ns是S树的节点数,nt是T树节点数,根据上方解法思路 ,要么S和T一起完事,要么肯定因为一个树先走完而结束,所以先走完的节点数必定少,因为二者是同步走下去的,走的节点数也就是min(ns,nt),所以得到时间复杂度。时间能超过100%的提交。