LeetCode-572. Subtree of Another Tree

本文介绍了一种高效的子树匹配算法,该算法通过寻找与目标树高度相同的子树来进行精确匹配,提高了搜索效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

Given two non-empty binary trees s and t, check whether tree t has exactly the same structure and 
node values with a subtree of s. A subtree of s is a tree consists of a node in s and all of this 
node's descendants. The tree s could also be considered as a subtree of itself.

Example 1

Given tree s:

     3
    / \
   4   5
  / \
 1   2
Given tree t:
   4 
  / \
 1   2

Return true, because t has the same structure and node values with a subtree of s.

Example 2

Given tree s:

     3
    / \
   4   5
  / \
 1   2
    /
   0
Given tree t:
   4
  / \
 1   2
Return false.

Solution 1(C++)

static int x =[](){std::ios::sync_with_stdio(false); cin.tie(NULL); return 0;}();
class Solution {
public:
    bool isSameTree(TreeNode* s, TreeNode* t){
        if(!s && !t) return true;
        else if(!s || !t) return false;
        if(s->val != t->val) return false;
        else return isSameTree(s->left, t->left) && isSameTree(s->right, t->right);
    }
    bool isSubtree(TreeNode* s, TreeNode* t) {
        if(!s || !t) return false;
        if(isSameTree(s, t)) return true;
        else return isSubtree(s->right, t) || isSubtree(s->left, t);
    }
};

Solution 2(C++)

class Solution {
    vector<TreeNode*> nodes;
public:
    bool checkSubtree(TreeNode* s,TreeNode* t)
    {
        if(!s &&!t)
            return true;
        if(!s ||!t||s->val!=t->val)
            return false;
        return checkSubtree(s->left,t->left)&&checkSubtree(s->right,t->right);
    }
    int getDepth(TreeNode* r,int d)
    {
        if(!r)
            return -1;
        int depth=max(getDepth(r->left,d),getDepth(r->right,d))+1;

        if(depth==d)
            nodes.push_back(r);

        return depth;
    }
    bool isSubtree(TreeNode* s, TreeNode* t) {
        if(!s && !t)
            return true;
        if(!s || !t)
            return false;

        getDepth(s,getDepth(t,-1));

        for(TreeNode* n:nodes )
        {
            if(checkSubtree(n,t))
                return true;
        }
        return false;
    }
};

算法分析

解法二比我自己写的解法一更高效的原因就是,它直接在s中找与t高度相同的树,然后进行比较。虽然用到了额外的vector来储存这些高度相同的根节点,但是也挺好的。

程序分析

略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值