树的子结构
题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(我们约定空树不是任意一个树的子结构)
例如:
A是左边的树,B是右边的树,很容易看出,B是A的子结构,因此返回为True
牛客网题目链接
题解
这个题目的重点在于判断子结构,如果B是A的子结构,那么一定会有
(1)B的根结点值等于A的某个节点
A
1
A_1
A1的值
(2)B的左子树的所有值等于
A
1
A_1
A1的左子树的部分值
(3)B的左子树的所有值等于
A
1
A_1
A1的右子树的部分值
因此这个题目的算法步骤可以描述如下:
1.A和B的根节点的值是否相等,如果相等同时递归
2.判断left节点,如果B的左节点为None,则说明A的left节点满足条件。
3.若B的节点不为,并None且A的left节点为None,或者说它们二者的值不一样,则B不是A的子结构。
4.A和B的right节点和第2,3步一样的判断,当left和right同时成立,B才是A的子结构
代码
class Solution:
def HasSubtree(self, pRoot1, pRoot2):
# write code here
if pRoot1 == None or pRoot2 == None:
return False
return self.dfs(pRoot1,pRoot2) or self.HasSubtree(pRoot1.left,pRoot2) or self.HasSubtree(pRoot1.right, pRoot2)
def dfs(self,A,B):
if B == None:
return True
elif A == None:
return False
elif A.val != B.val:
return False
return self.dfs(A.left,B.left) and self.dfs(A.right, B.right)