""" 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
# 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
# -*- 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]