# Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution(object): def diameterOfBinaryTree(self, root): """ :type root: TreeNode :rtype: int """ def helper(root): if not root: return 0, 0 lr, ll = helper(root.left) rr, rl = helper(root.right) return max(lr, rr, ll + rl), max(ll, rl) + 1 return helper(root)[0] import utils t = utils.maketree([1, 2, 3, 4, 5]) print Solution().diameterOfBinaryTree(t)
# self.left = None # self.right = None class Solution(object): def __init__(self): self.res = float('-inf') def maxPathSum(self, root): """ :type root: TreeNode :rtype: int """ if not root: return 0 def maxPathSumHelper(root): if not root: return float('-inf') lm = max(0, maxPathSumHelper(root.left)) rm = max(0, maxPathSumHelper(root.right)) self.res = max(self.res, root.val + lm + rm) return max(root.val + lm, root.val + rm) maxPathSumHelper(root) return self.res import utils print Solution().maxPathSum(utils.maketree([2, 1, 3]))
# self.val = x # self.left = None # self.right = None class Solution(object): def kthSmallest(self, root, k): """ :type root: TreeNode :type k: int :rtype: int """ def kthSmallestHelper(root, k): # print 'kthSmallestHelper', root, root.val if root else -1, k if not root: return None, 0 val, leftsize = kthSmallestHelper(root.left, k) # print 'k', k, 'val', val if val is not None: return val, 0 if leftsize == k-1: return root.val, 0 else: val, rightsize = kthSmallestHelper(root.right, k - leftsize - 1) if val is not None: return val, 0 else: return None, leftsize+1+rightsize return kthSmallestHelper(root, k)[0] import utils print Solution().kthSmallest(utils.maketree([2,1]), 2)
# self.val = x # self.left = None # self.right = None class Solution(object): def postorderTraversal(self, root): """ :type root: TreeNode :rtype: List[int] """ if not root: return [] stack = [] stack.append((1, root)) postorder = [] while stack: op, root = stack.pop() if op == 1: stack.append((2, root)) if root.right: stack.append((1, root.right)) if root.left: stack.append((1, root.left)) else: postorder.append(root.val) return postorder import utils print Solution().postorderTraversal(utils.maketree([1,None,2,3]))
# self.val = x # self.left = None # self.right = None class Solution: # @param root, a tree node # @return a boolean def isSymmetric(self, root): if root is None: return True return self.solve(root.left, root.right) def solve(self, left, right): if left is None and right is None: return True if left is None or right is None: return False if left.val != right.val: return False return self.solve(left.left, right.right) and self.solve( left.right, right.left) import utils as u print Solution().isSymmetric(u.maketree([1, 2, 2, 3, 4, 4, 3])) print Solution().isSymmetric(u.maketree([1, 2, 2, None, 3, None, 3]))
while q: qsize = len(q) head = tail = ListNode(None) for i in xrange(qsize): treenode = q.popleft() node = ListNode(treenode.val) tail.next = node tail = node if treenode.left: q.append(treenode.left) if treenode.right: q.append(treenode.right) linkedLists.append(head.next) return linkedLists import utils # 5 # 4 7 # 3 6 8 root = utils.maketree([1, 2, 2, None, 3, None, 3]) utils.printtree(root) lists = getLevels(root) for l in lists: utils.printlist(l )
from collections import Counter class Solution(object): def findFrequentTreeSum(self, root): """ :type root: TreeNode :rtype: List[int] """ if not root: return [] sums = Counter() def postorder(root): ls, rs = 0, 0 if root.left: ls = postorder(root.left) if root.right: rs = postorder(root.right) # visit root now s = root.val + ls + rs sums[s] += 1 return s postorder(root) maxSumCount = max(sums.itervalues()) return [s for s, c in sums.iteritems() if c == maxSumCount] import utils print Solution().findFrequentTreeSum(utils.maketree([5, 2, -3]))
ll, lr = None, None if root.right: rl, rr = root.right.left, root.right.right else: rl, rr = None, None l, r = root.left, root.right c = min(min(l._c, l._noc) if l else 0, (min(ll._c, ll._noc) if ll else 0) + (min(lr._c, lr._noc) if lr else 0)) + \ min(min(r._c, r._noc) if r else 0, (min(rl._c, rl._noc) if rl else 0) + (min(rr._c, rr._noc) if rr else 0)) + 1 if not l and not r: noc = INF elif not l: # must r noc = r._c elif not r: # must l noc = l._c else: # must l and r noc = min(l._c + min(r._c, r._noc), r._c + min(l._c, l._noc)) root._c, root._noc = c, noc solve(root) return min(root._c, root._noc) import utils null = None root = utils.maketree( [0, null, 0, null, 0, null, 0, null, 0, 0, 0, null, null, 0, 0]) print Solution().minCameraCover(root)
# Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution(object): def invertTree(self, root): """ :type root: TreeNode :rtype: TreeNode """ if not root: return root root.right, root.left = self.invertTree(root.left), self.invertTree( root.right) return root import utils t = utils.maketree([1, 2, 7, 1, 3, 6, 9]) utils.printtree(t) t = Solution().invertTree(t) utils.printtree(t)
root.left = self.deleteNode(root.left, key) elif key > root.val: root.right = self.deleteNode(root.right, key) else: # root.val == key, removing root ... if root.left is None: root = root.right elif root.right is None: root = root.left else: # both left and right is non-empty root.val = self.deleteLeftMostNode(root.right, root) print 'delete', root.val return root def deleteLeftMostNode(self, root, parent): node = root isParentLeft = False while node.left: parent = node node = node.left isParentLeft = True if isParentLeft: parent.left = node.right else: parent.right = node.right return node.val from utils import printtree, maketree printtree(Solution().deleteNode(maketree([5,3,6,2,4,None,7]), 3))
# self.val = x # self.left = None # self.right = None class Solution(object): def __init__(self): self.sum = 0 def convertBST(self, root): """ :type root: TreeNode :rtype: TreeNode """ def revorder(root): if not root: return revorder(root.right) # handle root here # print self.sum, root.val self.sum = root.val = self.sum + root.val revorder(root.left) revorder(root) return root import utils utils.printtree(Solution().convertBST(utils.maketree([5, 2, 13])))
if node.left: postorder(node.left) if node.right: postorder(node.right) node._sum = (node.left._sum if node.left else 0) + node.val + (node.right._sum if node.right else 0) node._size = (node.left._size if node.left else 0) + 1 + (node.right._size if node.right else 0) postorder(root) return self.solve(root) def solve(self, root): ret = 0 if root.left: ret += self.solve(root.left) lsize, lsum = root.left._size, root.left._sum ret += abs(lsum - lsize) if root.right: ret += self.solve(root.right) rsize, rsum = root.right._size, root.right._sum ret += abs(rsum - rsize) return ret import utils print Solution().distributeCoins(utils.maketree([3, 0, 0]))
def rob(self, root): """ :type root: TreeNode :rtype: int """ return self.solve(root, False) def solve(self, root, isParentRobed): if not root: return 0 if isParentRobed: if hasattr(root, 'v1'): return root.v1 else: if hasattr(root, 'v2'): return root.v2 if isParentRobed: ret = self.solve(root.left, False) + self.solve(root.right, False) root.v1 = ret else: v1 = self.solve(root.left, False) + self.solve(root.right, False) v2 = root.val + self.solve(root.left, True) + self.solve( root.right, True) ret = max(v1, v2) root.v2 = ret return ret print Solution().rob(utils.maketree([3, 2, 3, None, 3, None, 1])) print Solution().rob(utils.maketree([3, 4, 5, 1, 3, None, 1])) # utils.printtree(utils.maketree( [3, 4, 5, 1, 3, None, 1] ))
h.update(lh+str(root.val)+rh) root.hash = h.digest() # print root.hash return root.hash makehash(s) makehash(t) def isEqual(t1, t2): if not t1 and not t2: return True elif not t1 or not t2: return False else: return t1.hash == t2.hash if isEqual(s, t): return True return s is not None and (self.isSubtree(s.left, t) or self.isSubtree(s.right, t)) import utils null = None s = utils.maketree( [1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,2] ) t = utils.maketree([1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,null,1,2] ) utils.printtree(s) utils.printtree(t) print Solution().isSubtree(s, t)
self.stk.pop() # pop cur while True: if not self.stk: parent = None break parent = self.stk[-1] if parent.left == cur: break cur = parent self.stk.pop() # found parent with parent.left == cur cur = parent self.cur = cur if self.stk: assert self.cur == self.stk[-1] else: assert self.cur is None # print 'movetonext', cur import utils t = utils.maketree([1, None, 2]) it = BSTIterator(t) while it.hasNext(): print it.next()
:type sum: int :rtype: int """ return self.pathSumHelper(root, sum, False) def pathSumHelper(self, root, sum, pathStarted): if not root: return 0 n = 0 if root.val == sum: # print root.val, sum n += 1 if root.left: n += self.pathSumHelper(root.left, sum - root.val, True) if not pathStarted: n += self.pathSumHelper(root.left, sum, False) if root.right: n += self.pathSumHelper(root.right, sum - root.val, True) if not pathStarted: n += self.pathSumHelper(root.right, sum, False) return n import utils t = utils.maketree([10, 5, -3, 3, 2, None, 11, 3, -2, None, 1]) print Solution().pathSum(t, 8)
# @param root, a tree node # @return an integer def maxPathSum(self, root): if root is None: return 0 return self.solve(root)[0] def solve(self, root): if root.left is None and root.right is None: return root.val, root.val if root.right is None: LS = self.solve(root.left) maxsum = max(LS[0], LS[1] + root.val, root.val) tothis = max(root.val + LS[1], root.val) elif root.left is None: RS = self.solve(root.right) maxsum = max(RS[0], RS[1] + root.val, root.val) tothis = max(root.val + RS[1], root.val) else: LS = self.solve(root.left) RS = self.solve(root.right) maxsum = max(LS[0], RS[0], LS[1] + RS[1] + root.val, LS[1] + root.val, RS[1] + root.val, root.val) tothis = max(root.val + max(LS[1], RS[1]), root.val) # print maxsum, tothis return maxsum, tothis print Solution().maxPathSum(u.maketree([2, -1]))