LeetCode 100.相同的树(c++)

97 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情

前言

从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!

一、题目描述

100.相同的树

给你两棵二叉树的根节点 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);

    }
};

四、总结

果然,跟树有关的题目大部分都是用到递归解决的。