我们设计一个函数 $\textit{dfs}(A, B)$,用于判断树 A 中以节点 A 为根节点的子树是否包含树 B。
函数 $\textit{dfs}(A, B)$ 的执行步骤如下:
如果树 B 为空,则树 B 是树 A 的子结构,返回 true;
如果树 A 为空,或者树 A 的根节点的值不等于树 B 的根节点的值,则树 B 不是树 A 的子结构,返回 false;
判断树 A 的左子树是否包含树 B 的左子树,即调用 $\textit{dfs}(A.left, B.left)$,并且判断树 A 的右子树是否包含树 B 的右子树,即调用 $\textit{dfs}(A.right, B.right)$。如果其中有一个函数返回 false,则树 B 不是树 A 的子结构,返回 false;否则,返回 true。
在函数 isSubStructure 中,我们首先判断树 A 和树 B 是否为空,如果其中有一个为空,则树 B 不是树 A 的子结构,返回 false。然后,我们调用 $\textit{dfs}(A, B)$,判断树 A 是否包含树 B。如果是,则返回 true;否则,递归判断树 A 的左子树是否包含树 B,以及树 A 的右子树是否包含树 B。如果其中有一个返回 true,则树 B 是树 A 的子结构,返回 true;否则,返回 false。
时间复杂度 $O(n \times m)$,空间复杂度 $O(n)$。其中 $n$ 和 $m$ 分别是树 A 和树 B 的节点个数。
1 2 3 4 5 6 7 8 910111213141516171819202122
# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = NoneclassSolution:defisSubStructure(self,A:TreeNode,B:TreeNode)->bool:defdfs(A,B):ifBisNone:returnTrueifAisNoneorA.val!=B.val:returnFalsereturndfs(A.left,B.left)anddfs(A.right,B.right)ifAisNoneorBisNone:returnFalseifdfs(A,B):returnTruereturnself.isSubStructure(A.left,B)orself.isSubStructure(A.right,B)
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */classSolution{publicbooleanisSubStructure(TreeNodeA,TreeNodeB){if(A==null||B==null){returnfalse;}returndfs(A,B)||isSubStructure(A.left,B)||isSubStructure(A.right,B);}privatebooleandfs(TreeNodeA,TreeNodeB){if(B==null){returntrue;}if(A==null||A.val!=B.val){returnfalse;}returndfs(A.left,B.left)&&dfs(A.right,B.right);}}
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */classSolution{public:boolisSubStructure(TreeNode*A,TreeNode*B){if(!A||!B){returnfalse;}returndfs(A,B)||isSubStructure(A->left,B)||isSubStructure(A->right,B);}booldfs(TreeNode*A,TreeNode*B){if(!B){returntrue;}if(!A||A->val!=B->val){returnfalse;}returndfs(A->left,B->left)&&dfs(A->right,B->right);}};
1 2 3 4 5 6 7 8 9101112131415161718192021222324
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */funcisSubStructure(A*TreeNode,B*TreeNode)bool{vardfsfunc(A,B*TreeNode)booldfs=func(A,B*TreeNode)bool{ifB==nil{returntrue}ifA==nil||A.Val!=B.Val{returnfalse}returndfs(A.Left,B.Left)&&dfs(A.Right,B.Right)}ifA==nil||B==nil{returnfalse}returndfs(A,B)||isSubStructure(A.Left,B)||isSubStructure(A.Right,B)}
/** * Definition for a binary tree node. * public class TreeNode { * public int val; * public TreeNode left; * public TreeNode right; * public TreeNode(int x) { val = x; } * } */publicclassSolution{publicboolIsSubStructure(TreeNodeA,TreeNodeB){if(A==null||B==null){returnfalse;}returndfs(A,B)||IsSubStructure(A.left,B)||IsSubStructure(A.right,B);}publicbooldfs(TreeNodeA,TreeNodeB){if(B==null){returntrue;}if(A==null||A.val!=B.val){returnfalse;}returndfs(A.left,B.left)&&dfs(A.right,B.right);}}