1. 题目描述
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
2. 思路
(1)先序遍历树A找到第一个与树B相等的值,如果没找到,则直接返回false;
(2)找到之后深入查找比较B是否为A的子结构,查找比较正确后就可以返回true,不需要继续遍历。
(3)如果不正确则继续步骤(1)和(2)。
3. 代码
class Solution {
boolean result = false;
//判断树B是否为A的子结构
public boolean isSubStructure(TreeNode A, TreeNode B) {
//空树不是任意一个树的子结构
if(A==null || B==null)
return false;
preOrder(A,B);//先序遍历
return result;
}
//先序遍历找到第一个相等的值,再深入查找比较
public void preOrder(TreeNode A, TreeNode B){
if(A==null){
return;
}
if((A.val == B.val) && isSon(A,B)==true){//找到相等的值,深入比较
//比较正确后就可以返回结果,不需要继续遍历
result = true;
return;
}
preOrder(A.left,B);
preOrder(A.right,B);
}
public boolean isSon(TreeNode A, TreeNode B){
//树A遍历完,子树B还没遍历完,返回false
if(A==null && B!=null)
return false;
//子树B遍历结束则返回true
if(B==null)
return true;
//继续比较左子树和右子树是否相同
return A.val == B.val && isSon(A.left,B.left) && isSon(A.right,B.right);
}
}