解题思路
设计一个算法让每个树对应一个hash值
hash(node) = node.val+hash(node.left)*117 + hash(node.right)*31
然后将subRoot的hash求出
再对root进行dfs 看有没有hash相同的子树即可
代码
class Solution {
public boolean isSubtree(TreeNode root, TreeNode subRoot) {
int hash = dfs(subRoot);//首先算出subRoot的hash值
int temp= dfs2(root, hash);//然后对root进行dfs 如果碰到一样的就返回-1
return temp==-1;
}
int dfs(TreeNode node){
if(node==null) return 3;
return node.val+dfs(node.left)*117 + dfs(node.right)*31;
}
int dfs2(TreeNode node, int hash){
if(node==null) return 3;
int lefthash= dfs2(node.left,hash);
if(lefthash==-1 ) return -1; //-1 表示存在相同子树
int righthash= dfs2(node.right,hash);
if(righthash==-1 ) return -1;
int h = node.val + lefthash*117 + righthash*31;
if(h==hash) return -1;
else return h;
}
}
这篇博客介绍了如何通过计算树节点的哈希值来判断一个给定的子树是否存在于另一个大树中。算法使用了深度优先搜索(DFS)策略,通过递归计算每个节点的哈希值,结合特定的哈希计算公式实现。首先计算子树的哈希值,然后在大树中遍历,如果遇到相等的哈希值则说明存在相同的子树。
735

被折叠的 条评论
为什么被折叠?



