1 题目描述
2 算法思路
B的根节点可能是A的任意一个节点,要完成判断,需要下述两步工作:
- 先序遍历A中的每个节点 ---- 对应函数isSubStructure
- 判断 A中 以当前节点为根节点的子树是否包含树B ---- 对应函数recur
两个函数的解析
- recur(A,B)
- 终止条件
- 当B为空时,就代表已经完全匹配完成,返回true
- 当A为空时,就代表没有包含,就返回false
- 当A和B的值不相同,就返回false
- 返回值
- 向左递归, recur(A.left , B.left );
- 向右递归 , recur(A.rigth, B.rigth);
- isSubStructure( A, B)
- 特殊值处理:当树A 或 树B 为空时,返回false
- 返回值:如果树B 是 A的子结构就是下列三种情况,用|| 链接,可以减少很多判断,因为 || 有隔断效应
- 当节点A 为根节点的子树 包含B,就是recur(A,B);
- 如果是树A的左子树的子结构,对应isSubStructure(A.left, B);
- 如果是树A的右子树的子结构,对应isSubStructure(A.rigth, B);
3 代码
class Solution {
public boolean isSubStructure(TreeNode A, TreeNode B) {
if(A == null || B == null)
return false;
return recur(A,B) || isSubStructure(A.left,B) || isSubStructure(A.right,B);
}
public boolean recur(TreeNode A, TreeNode B){
if(B == null)
return true;
if(A == null || A.val != B.val)
return false;
//此时A B都不为空,且当前节点值相等,向左右递归
return recur(A.left,B.left) && recur(A.right,B.right);
}
}