牛客网 剑指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相同的部分
1.采用递归的思想,如果节点root1与root2的节点不同,则说明pRoot1的子树与pRoot2不具有相同的节点
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)
         

 

posted @ 2021-09-03 12:26  zhang_upstar  阅读(35)  评论(0编辑  收藏  举报