题目链接:剑指 Offer 26. 树的子结构
题目描述:
先找出A树所有和B树根节点相同的节点存入集合,遍历集合元素做起始点,遍历B树,如果都结构和B树相同则返回true
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
private int cnt;
public boolean isSubStructure(TreeNode A, TreeNode B) {
if(B==null)return false;
List<TreeNode> targets=new ArrayList<>();
TreeNode node;
pre(A,B,targets);
compar(B,B);
int aim=cnt;
//以相同节点为起始
for (TreeNode target : targets) {
node=B;
cnt=0;
compar(node,target);
//通过相同节点的数量判断结构是否相同
if(cnt==aim)return true;
}
return false;
}
//比较函数,遍历B树,判断结构是否相同
public void compar(TreeNode node1,TreeNode node2){
if(node1==null||node2==null)return;
if(node1.val!= node2.val)return;
cnt++;
compar(node1.left,node2.left);
compar(node1.right,node2.right);
}
//找与B树根节点相同的节点
public void pre(TreeNode root,TreeNode target,List<TreeNode> list){
if(root==null)return;
if(root.val==target.val)list.add(root);
pre(root.left,target,list);
pre(root.right,target,list);
}
}