开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情
前言
从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!
一、题目描述
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例 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]内 -104 <= Node.val <= 104
二、思路分析
最开始看到这道题,我的想法是能不能直接用p==q来返回结果呢?或者说定义两个容器,把这两个树都遍历一遍。后来觉得不行。想了半天又去评论区看了看才知道该如何做这道题。就是通过深度优先的方法。
1、如果两个二叉树都为空,则两个二叉树相同。
2、如果两个二叉树中有且只有一个为空,则两个二叉树一定不相同。
3、如果两个二叉树都不为空,那么首先判断它们的根节点的值是否相同,若不相同则两个二叉树一定不同,若相同,再分别判断两个二叉树的左子树是否相同以及右子树是否相同。
这是一个递归的过程,因此可以使用深度优先搜索,递归地判断两个二叉树是否相同。
三、AC代码
class Solution {
public:
bool isSameTree(TreeNode* p, TreeNode* q) {
if(p==NULL&&q==NULL) return true;
if(p==NULL||q==NULL) return false;
if(p->val!=q->val){
return false;
}
return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);
}
};
四、总结
果然,跟树有关的题目大部分都是用到递归解决的。