Leetcode每日一题(20200807)

今日题目

T100 相同的树(简单,递归,搜索)

题目描述

给定两个二叉树,编写一个函数来检验它们是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例 1:
输入:      1        1
         /  \      / \
        2    3    2   3
[1,2,3],   [1,2,3]
输出: true

示例 2:
输入:      1          1
          /           \
         2             2
[1,2],     [1,null,2]
输出: false

示例 3:

输入:      1         1
          / \       / \
         2   1     1   2
[1,2,1],   [1,1,2]
输出: false

标签

递归,深度优先搜索,广度优先搜索

解析

python解法

#dfs
class Solution:
    def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
        if p == None:
            return q == None
        if q == None:
            return False
        if p.val != q.val:
            return false
        return self.isSameTree(p.left, q.left) and self.isSameTree(
            p.right, q.right)
#bfs
class Solution:
    def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
        if p == None:
            return q == None
        if q == None:
            return False
        q1 = collections.deque([p])
        q2 = collections.deque([q])
        while q1:
            node1 = q1.popleft()
            node2 = q2.popleft()
            if node1.val != node2.val:
                return False
            if node1.left and node2.left:
                q1.append(node1.left)
                q2.append(node2.left)
            elif not (not node1.left and not node2.left):
                return False
            if node1.right and node2.right:
                q1.append(node1.right)
                q2.append(node2.right)
            elif not (not node1.right and not node2.right):
                return False
        return True

C++解法

//dfs
class Solution
{
public:
    bool isSameTree(TreeNode *p, TreeNode *q)
    {
        if (p == nullptr)
        {
            return q == nullptr;
        }
        if (q == nullptr)
        {
            return false;
        }
        if (p->val != q->val)
        {
            return false;
        }
        return (isSameTree(p->left, q->left) && isSameTree(p->right, q->right));
    }
};
//bfs
class Solution {
public:
    bool isSameTree(TreeNode* p, TreeNode* q) {
        if (p==nullptr && q==nullptr)
            return true;
        if (p==nullptr)
            return false;
        if (q==nullptr)
            return false;
        queue<TreeNode*>q1, q2;
        q1.push(p);
        q2.push(q);
        while (q1.size()>0) {
            auto node1 = q1.front();
            auto node2 = q2.front();
            q1.pop();
            q2.pop();
            if (node1->val != node2->val)return false;
            if (node1->left!=nullptr && node2->left!=nullptr) {
                q1.push(node1->left);
                q2.push(node2->left);
            }
            else if (node1->left==nullptr && node2->left==nullptr)
                ;
            else
                return false;
            if (node1->right!=nullptr && node2->right!=nullptr) {
                q1.push(node1->right);
                q2.push(node2->right);
            }
            else if (node1->right==nullptr && node2->right==nullptr)
                ;
            else
                return false;
        }
        return true;
    }
};

备注

推荐直接递归+dfs

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值