Beispiel #1
0
        """

        if s is None and t is None:
            return True
        elif s is None or t is None:
            return False

        return self.equals(s, t) or self.isSubtree(
            s.left, t) or self.isSubtree(s.right, t)

    def equals(self, s, t):
        if s is None and t is None:
            return True
        elif s is None or t is None:
            return False

        return s.val == t.val and self.equals(s.left, t.left) and self.equals(
            s.right, t.right)


from util import TreeNode
solution = Solution()
assert solution.isSubtree(TreeNode.of([3, 4, 5, 1, 2]), TreeNode.of([4, 1, 2]))
assert not solution.isSubtree(TreeNode.of([3, 4, 5, 1, 2, None, None, 0]),
                              TreeNode.of([4, 1, 2]))
assert solution.isSubtree(
    TreeNode.of([
        1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None,
        1, None, 1, None, 1, 2
    ]), TreeNode.of([1, None, 1, None, 1, None, 1, None, 1, None, 1, 2]))
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# https://leetcode.com/problems/merge-two-binary-trees/description/

from util import TreeNode

class Solution(object):
    def mergeTrees(self, t1, t2):
        """
        :type t1: TreeNode
        :type t2: TreeNode
        :rtype: TreeNode
        """

        if t1 is None and t2 is None:
            return None
        
        root = TreeNode(0)
        if t1:
            root.val += t1.val
        if t2:
            root.val += t2.val

        root.left = self.mergeTrees(t1.left if t1 else None, t2.left if t2 else None)
        root.right = self.mergeTrees(t1.right if t1 else None, t2.right if t2 else None)
        return root

solution = Solution()
assert solution.mergeTrees(TreeNode.of([1,3,2,5]), TreeNode.of([2,1,3,None,4,None,7])) == [3,4,5,5,4,None,7]
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# https://leetcode.com/problems/diameter-of-binary-tree/description/

class Solution(object):
    def diameterOfBinaryTree(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """

        if root is None:
            return 0

        return self.inner(root)[0]-1
        
    def inner(self, root):
        """return (max_diameter, max_depth)"""
        if root is None:
            return (0, 0)

        l_diameter, l_depth = self.inner(root.left)
        r_diameter, r_depth = self.inner(root.right)
        return (max(l_diameter, r_diameter, l_depth+r_depth+1) , max(l_depth, r_depth)+1)

from util import TreeNode
solution = Solution()
assert solution.diameterOfBinaryTree(TreeNode.of([1,2,3,4,5])) == 3
Beispiel #4
0
# condition to optimize

from util import TreeNode


class Solution(object):
    def pathSum(self, root, sum):
        return self.inner(root, sum, 0, {0: 1})

    def inner(self, root, target, sofar, counts):
        if not root:
            return 0

        ret = 0
        complement = sofar + root.val - target
        if complement in counts:
            ret += counts[complement]

        sofar += root.val
        counts.setdefault(sofar, 0)  # consider root.val is 0, what happens?
        counts[sofar] += 1
        ret += self.inner(root.left, target, sofar, counts)
        ret += self.inner(root.right, target, sofar, counts)
        counts[sofar] -= 1
        return ret


solution = Solution()
assert solution.pathSum(
    TreeNode.of([10, 5, -3, 3, 2, None, 11, 3, -2, None, 1]), 8) == 3
Beispiel #5
0
# -*- coding: utf-8 -*-

# https://leetcode.com/problems/convert-bst-to-greater-tree/description/

from util import TreeNode


class Solution(object):
    def convertBST(self, root):
        """
        :type root: TreeNode
        :rtype: TreeNode
        """
        return self.rec(root, 0)[1]

    def rec(self, root, sum):
        if root is None:
            return (sum, None)

        total, r = self.rec(root.right, sum)
        new_root = TreeNode(root.val + total)
        new_total, l = self.rec(root.left, new_root.val)
        new_root.left = l
        new_root.right = r
        return (new_total, new_root)


solution = Solution()
assert solution.convertBST(TreeNode.of([5, 2, 13])) == [18, 20, 13]
assert solution.convertBST(TreeNode.of([2, 0, 3, -4, 1])) == [5, 6, 3, 2, 6]