题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
//分为两部分:一是找到树B根节点在树A中的位置;而是判断树B的结构是否包含在树A中
public class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
if(root1==null)
return false;
if(root2==null)
return false;
boolean result=false;
//找到树B的根节点在树A中的位置
if(root1.val==root2.val)
{
//找到树B根节点在树A中的位置后,要紧接着判断树A中是否包含树B的结构,因为后面可能还有域树B根节点一致的节点
result=find2(root1,root2);
}
if(!result)
{
result=HasSubtree(root1.left,root2);
}
if(!result)
{
result=HasSubtree(root1.right,root2);
}
return result;//注意result的巧妙引入
}
//判断树A中是否包含树B的结构
public boolean find2(TreeNode p,TreeNode q)
{
if(q==null)//到达叶节点了
return true;//返回的是true
if(p==null)
return false;//这里是个坑,两个条件的顺序不可颠倒
//两个if排列,又不是if else if 要格外注意顺序和条件逻辑
if(p.val==q.val)
return find2(p.left,q.left)&&find2(p.right,q.right);
return false;
}
}
- 树A中不止一个节点与树B的根节点相同,前面的不一致,不代表后面的不一致,不要只执行前面的就停下来,左右子树同理
- 树A是包含树B的结构,而不是要与树B的结构一模一样,当到达树B的叶节点时返回true