Leetcode 572.另一棵树的子树

Problem

给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/subtree-of-another-tree

Code

Method 1

暴力DFS

class Solution {
public:
    //check方法,用来检查两个节点及其子节点是否一致
    bool check(TreeNode* temp, TreeNode* t) {
        //当两个节点都为空时,一致, 且在这种情况下,不再存在子节点
        if(temp==nullptr&&t==nullptr) return true;
        //当两个节点的值不相等或者两个节点中有且仅有一个为空时,不一致
        if ((temp!=nullptr&&t==nullptr)||(temp==nullptr&&t!=nullptr)||(temp->val!=t->val)) return false;
        //除去上述两种情况,剩下的情况为:节点的值相等。在这种情况下,则需要继续判断其子节点是否一致
        return check(temp->left, t->left)&&check(temp->right, t->right);
    }
    //find方法相当于dfs,遍历树的结点
    bool find(TreeNode* tree, TreeNode* t) {
        //防止tree为空时,tree->left或者right报错。
        //为什么不return true呢?因为在find函数中tree一直在变化,而t并没有,所以t不可能为空。
        if (tree==nullptr) return false;
        //dfs
        return check(tree, t) || find(tree->left, t) || find(tree->right, t);
    }
    bool isSubtree(TreeNode* s, TreeNode* t) {
        return find(s, t);
    }
};

Method Two

1.先序遍历必然连续;
2.检验 s 中是否包含和 t 具有相同结构和节点值的子树相当于检验s的先序序列中是否包含t的先序序列;
3.注意子树的概念。当某非空节点的子节点为空时,需要补上特殊值,比如rNULL或者lNULL。

综上,KMP!

Method Three

树哈希。
简单来讲,树哈希是构造一个特殊的函数,给树一个专有的值。
使用了树哈希之后,对于s树,可以得到一个数组。对于t
树,可以得到一个数字。遍历寻找就可以。

你可能感兴趣的:(题题题题题,#,各种比赛,#LeetCode,#,各种培训)