剑指offer 26 树的子结构

解题思路:递归

        1.即两次递归,首先是实现一个以第一棵树某一个节点为根节点的子树去和第二棵树比较,比较每一个节点,如果两棵树当前根节点的值相等,且左右子树的节点值也相等,则表明存在子树;第二次递归是遍历第一棵树的每一个节点,即子树与第二棵树比较。

class Solution:
    def HasSubtree(self , pRoot1: TreeNode, pRoot2: TreeNode) -> bool:
        # write code here
        #实现一个递归函数,判断两棵子树是否为子结构
        def is_sub(root1, root2):
            #如果树1已经没有节点了,树2还有,说明不是子结构
            if not root1 and root2:
                return False
            #如果都为空了或者树1还不为空树2为空了,说明当前这棵树中存在树2的子结构
            if not root1 or not root2:
                return True 
            return root1.val == root2.val and is_sub(root1.left, root2.left) and is_sub(root1.right, root2.right)
        #空树不为任何树的子结构
        if not pRoot2:
            return False
        #如果第一棵树没有结点了
        if not pRoot1:
            return False
        # if not pRoot1 or not pRoot2:
        #     return True

        #递归比较以某个节点为根节点的子树和另一棵树是否满足子树关系
        flag1 = is_sub(pRoot1, pRoot2)
        
        #左子树与另一棵树比较
        flag2 = self.HasSubtree(pRoot1.left, pRoot2)
        #右子树与另一棵树比较
        flag3 = self.HasSubtree(pRoot1.right, pRoot2)
        #只要存在一个子结构就ok
        return flag1 or flag2 or flag3

你可能感兴趣的:(二叉树,python,剑指offer,算法,leetcode,职场和发展)