剑指 Offer 26. 树的子结构
class Solution {
public boolean isSubStructure ( TreeNode A , TreeNode B ) {
if ( A == null || B == null ) {
return false ;
}
if ( isSameStructure ( A , B ) ) {
return true ;
}
return isSubStructure ( A . left, B ) || isSubStructure ( A . right, B ) ;
}
public boolean isSameStructure ( TreeNode p, TreeNode q) {
if ( q == null ) {
return true ;
}
if ( p == null ) {
return false ;
}
return p. val == q. val && isSameStructure ( p. left, q. left) && isSameStructure ( p. right, q. right) ;
}
}
572. 另一棵树的子树
class Solution {
public boolean isSubtree ( TreeNode root, TreeNode subRoot) {
if ( root == null ) {
return subRoot == null ;
}
if ( isSameTree ( root, subRoot) ) {
return true ;
}
return isSubtree ( root. left, subRoot) || isSubtree ( root. right, subRoot) ;
}
public boolean 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) ;
}
}
652. 寻找重复的子树
class Solution {
HashMap < String , Integer > memo = new HashMap < > ( ) ;
LinkedList < TreeNode > res = new LinkedList < > ( ) ;
public List < TreeNode > findDuplicateSubtrees ( TreeNode root) {
traverse ( root) ;
return res;
}
String traverse ( TreeNode root) {
if ( root == null ) {
return "#" ;
}
String left = traverse ( root. left) ;
String right = traverse ( root. right) ;
String subTree = left + "," + right + "," + root. val;
int count = memo. getOrDefault ( subTree, 0 ) ;
if ( count == 1 ) {
res. add ( root) ;
}
memo. put ( subTree, count + 1 ) ;
return subTree;
}
}