牛客网 剑指Offer JZ17 树的子结构
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
输入:
{8,8,#,9,#,2,#,5},{8,9,#,2}
返回值:
true
1.先遍历树pRoot1,如果遍历到和pRoot2节点值相同的节点,进入isSubTree方法判断接下来的节点是否都相同
2.节点都相同返回True;不相同返回False,并且继续遍历树pRoot1找下一个相同的节点
3.如果遍历完了pRoot1还没有返回过True,说明pRoot2不是pRoot1的子结构,返回False
isSubTree方法:用于判断从pRoot1的子树是否有和pRoot2相同的部分
2.节点都相同返回True;不相同返回False,并且继续遍历树pRoot1找下一个相同的节点
3.如果遍历完了pRoot1还没有返回过True,说明pRoot2不是pRoot1的子结构,返回False
isSubTree方法:用于判断从pRoot1的子树是否有和pRoot2相同的部分
1.采用递归的思想,如果节点root1与root2的节点不同,则说明pRoot1的子树与pRoot2不具有相同的节点
2.如果值相同,则递归判断(isSubTree)他们各自得左右节点的值是不是相同
2.如果值相同,则递归判断(isSubTree)他们各自得左右节点的值是不是相同
3.递归的终止条件时到达pRoot1或pRoot2的叶节点
class Solution: def dfs(self,a,b): if not b: return True elif not a: return False elif a.val != b.val: return False return self.dfs(a.left, b.left) and self.dfs(a.right,b.right) def HasSubtree(self, pRoot1, pRoot2): if not pRoot1 or not pRoot2: return False return self.dfs(pRoot1,pRoot2) or self.HasSubtree(pRoot1.left, pRoot2) or self.HasSubtree(pRoot1.right, pRoot2)