В этой статье мы пройдем интуитивное объяснение поддерева другого решения дерева.

Постановка задачи

Учитывая, что у нас есть корневые узлы двух бинарных деревьев, а именно «root» и «subRoot», наша задача состоит в том, чтобы определить, существует ли поддерево внутри «root», которое отражает структуру и значения узлов «subRoot». Если такое поддерево существует, мы вернем true; в противном случае мы вернем false.

Следует отметить, что поддеревом бинарного дерева называется дерево, образованное конкретным узлом и всеми его последующими потомками. Дерево также рассматривается как поддерево самого себя.

Код Python

class Solution:
    def isSubtree(self, root: Optional[TreeNode], 
                        subRoot: Optional[TreeNode]) -> bool:
        # If subRoot is None then its a subtree of tree
        if not subRoot:
            return True
        
        # If root is None, there can't be a subtree for it
        if not root:
            return False
        
        # If the entire tree rooted at root matches subRoot, return True
        if self.sameTree(root, subRoot):
            return True
        
        # Recursively check if subRoot is a subtree of the right 
        # or left subtrees of root
        return (self.isSubtree(root.right, subRoot) or
                self.isSubtree(root.left, subRoot))

    def sameTree(self, root1, root2):
        # If both roots are None, then they are same tree
        if not root1 and not root2:
            return True
        
        # If one root is None while the other is not, they cannot be 
        # the same tree
        elif not root1 and root2:
            return False
        elif root1 and not root2:
            return False
        else:
            # Check if values of the current nodes match and recursively 
            # check left and right subtrees
            return all([root1.val == root2.val,
                        self.sameTree(root1.left, root2.left),
                        self.sameTree(root1.right, root2.right)])

Пошаговое объяснение

Если вам понравилось объяснение, следуйте за мной, чтобы узнать больше! Не стесняйтесь оставлять свои комментарии, если у вас есть какие-либо вопросы или предложения.

Ссылки

[1] Leetcode: https://leetcode.com/problems/subtree-of-another-tree/