淼淼刷力扣

这篇博客介绍了一种利用深度优先搜索(DFS)判断两棵二叉树是否相同的方法。博主首先阐述了采用回溯法的策略,即通过后根遍历来比较节点值及其左右子树。在代码实现中,设置了明确的出口条件,当两个指针同时为空、一个为空另一个不为空或节点值不同时返回相应的判断结果。最后,博主分析了算法的时间复杂度为O(min(ns, nt)),其中ns和nt分别为两棵树的节点数。经过测试,代码运行效率较高。
摘要由CSDN通过智能技术生成

引言:

本人初次尝试写博客,希望各位看官大佬多多包容
有错误希望巨巨们提出来,我一定会及时改正,谢谢大家
在自己最好的年纪,找到了未来的目标
还有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%的提交。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JLU_LYM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值