def recurse(depth):
     nonlocal index
     
     # count the number of dashes starting from index position
     dash_count = 0
     while index + dash_count < len(S) and S[index + dash_count] == '-':
         dash_count += 1
     
     # number of dashes should be same as the depth value
     if dash_count != depth:
         return None
 
     # find the position+1 where the integer value ends
     int_end = index + dash_count
     while int_end < len(S) and S[int_end] != '-':
         int_end += 1
     
     # convert integer value from string to int type
     int_value = int(S[index+dash_count:int_end])
     
     # move index forward to the values read so far
     index = int_end
     
     # create a new node with this integer value
     root = TreeNode(int_value)
     # make recursive calls for left and right child (index is being tracked in global variable)
     root.left = recurse(depth+1)
     root.right = recurse(depth+1)
     
     return root
Пример #2
0
 def bst(v):
     if not v:
         return None
     mid = len(v) // 2
     root = TreeNode(v[mid])
     root.left = bst(v[:mid])
     root.right = bst(v[mid + 1:])
     return root
Пример #3
0
 def create_tree_helper(self, seq):
     if not seq:
         return None
     mid = (len(seq) - 1) / 2
     n = TreeNode(seq[mid])
     n.left = self.create_tree_helper(seq[:mid])
     n.right = self.create_tree_helper(seq[mid + 1:])
     return n
 def create_tree_helper(self,seq):
     if not seq:
         return None
     mid=(len(seq)-1)/2
     n=TreeNode(seq[mid])
     n.left=self.create_tree_helper(seq[:mid])
     n.right=self.create_tree_helper(seq[mid+1:])
     return n
Пример #5
0
 def copy(root):
     if not root:
         return None
     node = TreeNode(root.val)
     if root.left:
         node.left = copy(root.left)
     if root.right:
         node.right = copy(root.right)
     return node
 def sortedArrayToBST_helper(nums, low, high):
     if low > high: return None
     if low == high:
         return TreeNode(nums[low])
     mid = (low + high) // 2
     root = TreeNode(nums[mid])
     root.left = sortedArrayToBST_helper(nums, low, mid - 1)
     root.right = sortedArrayToBST_helper(nums, mid + 1, high)
     return root
 def helper(io, po):
     if not io and not po: return None
     root = TreeNode(po[-1])
     if len(po) == 1 or len(io) == 1:  return root
     indexL = io.index(po[-1])
     indexR = len(io) - (indexL+1)
     root.left = helper(io[:indexL], po[:-(indexR+1)])
     root.right = helper(io[indexL+1:], po[-(indexR+1):-1])
     return root
Пример #8
0
def convert2BST(arr):
    n = len(arr)
    if n == 0: return None
    if n == 1: return TreeNode(value=arr[0])
    idx = n // 2
    root = TreeNode(value=arr[idx],
                    left=convert2BST(arr[:idx]),
                    right=convert2BST(arr[idx + 1:]))
    return root
Пример #9
0
 def helper(node):
     if not node:
         t = TreeNode(val)
         return t
     if node.val < val:
         t = TreeNode(val)
         t.left = node
         return t
     node.right = helper(node.right)
     return node
def reverse_binary_tree(root):
    dummy_root = TreeNode(0)
    while root:
        right_child = root.right
        left_child = root.left
        root.left = dummy_root.left
        dummy_root.left = root
        root.right = left_child
        root = right_child
    return dummy_root.left
Пример #11
0
 def constructMaximumBinaryTree(self, nums):
     # Write your code here
     if not nums: return None
     mx, idx = 0, 0
     for i in range(len(nums)):
         if nums[i] > mx:
             mx = nums[i]
             idx = i
     root = TreeNode(nums[idx])
     root.left = self.constructMaximumBinaryTree(nums[:idx])
     root.right = self.constructMaximumBinaryTree(nums[idx + 1:])
     return root
Пример #12
0
def createBSTWithMinimalHeight(array):
	lengthArray = len(array)
	if lengthArray == 0:
		return None
	elif lengthArray == 1:
		return TreeNode(array[0])
	else:
		middle = lengthArray / 2
		root = TreeNode(array[middle])
		root.left = createBSTWithMinimalHeight(array[:middle])
		root.right = createBSTWithMinimalHeight(array[middle + 1:])
		return root
Пример #13
0
def createBSTWithMinimalHeight(array):
    lengthArray = len(array)
    if lengthArray == 0:
        return None
    elif lengthArray == 1:
        return TreeNode(array[0])
    else:
        middle = lengthArray / 2
        root = TreeNode(array[middle])
        root.left = createBSTWithMinimalHeight(array[:middle])
        root.right = createBSTWithMinimalHeight(array[middle + 1:])
        return root
 def bstFromPreorder(self, preorder):
     """
     :type preorder: List[int]
     :rtype: TreeNode
     """
     if not preorder: return None
     i, val = 1, preorder[0]
     while i < len(preorder):
         if preorder[i] > val: break
         i += 1
     node = TreeNode(val)
     node.left = self.bstFromPreorder(preorder[1:i])
     node.right = self.bstFromPreorder(preorder[i:])
     return node
Пример #15
0
 def constructMinimumBinaryTree(self, nums):
     """
     :type nums: List[int]
     :rtype: TreeNode
     """
     stack = []
     for num in nums:
         node = TreeNode(num)
         while stack and stack[-1].val > num:
             node.left = stack[-1]
             stack.pop()
         if stack: stack[-1].right = node
         stack.append(node)
         print(num, len(stack))
     return stack[0]
def buildTree(preorder, inorder):

    if not inorder: return None
    if not preorder: return None

    node = preorder[0]
    ind_root_in = inorder.index(node)
    len_left_tree = ind_root_in
    root_node = TreeNode(node)
    root_node.left = buildTree(preorder[1:len_left_tree + 1],
                               inorder[0:len_left_tree])
    root_node.right = buildTree(preorder[len_left_tree + 1:],
                                inorder[ind_root_in + 1:])

    return root_node
Пример #17
0
 def mergeTrees(self, root1, root2):
     """
     :type root1: TreeNode
     :type root2: TreeNode
     :rtype: TreeNode
     """
     if not root1 and not root2:
         return None
     elif not root1:
         return root2
     elif not root2:
         return root1
     else:
         node = TreeNode(root1.val + root2.val)
         node.left = self.mergeTrees(root1.left, root2.left)
         node.right = self.mergeTrees(root1.right, root2.right)
         return node
Пример #18
0
 def genTreeList(l, r):
     tlis = []
     if l > r:
         tlis.append(None)
         return tlis
     if l == r:
         tlis.append(TreeNode(l))
         return tlis
     for i in range(l, r + 1):
         left = genTreeList(l, i - 1)
         right = genTreeList(i + 1, r)
         for lnode in left:
             for rnode in right:
                 root = TreeNode(i)
                 root.left = lnode
                 root.right = rnode
                 tlis.append(root)
     return tlis
        def dfs(s, depth, i):
            nDashes = 0
            while i + nDashes < len(s) and s[i + nDashes] == '-':
                nDashes += 1
            if nDashes != depth:
                return None

            i += depth
            start = i
            while i < len(s) and s[i].isdigit():
               i += 1

            val = int(s[start:i])
            root = TreeNode(val)

            root.left = dfs(s, depth + 1, i)
            root.right = dfs(s, depth + 1, i)

            return root
Пример #20
0
 def createBinaryTree(self, descriptions: List[List[int]]) -> Optional[TreeNode]:
     m, roots = {}, set()
     def conn_child(par, chi, left):
         if left == 0: par.right = chi
         else: par.left = chi
     for vpar,vchi,left in descriptions:
         if vpar in m:                
             if vchi not in m:
                 m[vchi] = TreeNode(vchi)
         elif vchi in m:
             m[vpar] = TreeNode(vpar)
         else:
             m[vchi] = TreeNode(vchi)
             m[vpar] = TreeNode(vpar)                                
         conn_child(m[vpar], m[vchi], left)
         roots.add(vchi)
     for vpar,_,_ in descriptions:
         if vpar not in roots:
             return m[vpar]
     return None
    def Deserialize(self, s):
        self.flag += 1
        lis = s.split(',')
        if self.flag >= len(s):
            return None

        root = None
        if lis[self.flag] != '#':
            root = TreeNode(int(lis[self.flag]), left=self.Deserialize(s),\
                            right=self.Deserialize(s))
        return root
Пример #22
0
def convert2BST_link(node, start, end):
    if start > end or node is None:
        return None, node
    mid = (start + end) // 2
    left_tree, node = convert2BST_link(node, start, mid - 1)
    root = TreeNode(value=node.value)
    node = node.next
    right_tree, node = convert2BST_link(node, mid + 1, end)
    root.left = left_tree
    root.right = right_tree
    return root, node
Пример #23
0
 def test_depth(self):
     temp = BinaryTree()
     self.assertEqual(temp.depth(temp.root), 0)
     temp.root = TreeNode(10)
     self.assertEqual(temp.depth(temp.root), 1)
     temp.initExampleTree()
     self.assertEqual(temp.depth(temp.root), 3)
     temp.initLeftLeaningTree()
     self.assertEqual(temp.depth(temp.root), 11)
     temp.initRightLeaningTree()
     self.assertEqual(temp.depth(temp.root), 11)
 def helper(s, d):
     if not s: return None
     # s1 = s.split('-'*d) 
     i = 0
     while i < len(s) and s[i].isdigit():
         i += 1
     # print(s, s[:i])
     root = TreeNode(int(s[:i]))
     if i == len(s): return root
     # j = i 
     while i < len(s) and s[i] == '-':
         i += 1
     idx = search(s[i:], d)
     print(d, i, '#'+s[i:]+'#', idx)
     if idx != -1:
         root.left = helper(s[i:i+idx], d+1)
         root.right = helper(s[i+idx+d:], d+1)
     else:
         root.left = helper(s[i:], d+1)
     return root
    def sortedListToBST(self, head):
        """
        :type head: ListNode
        :rtype: TreeNode
        """
        """
        if not head: return None
        if not head.next: return TreeNode(head.val)
        slow, fast, pre = head, head, None
        while fast and fast.next:
            pre, slow, fast = slow, slow.next, fast.next.next
        pre.next = None   # cut off the left half

        root = TreeNode(slow.val)
        root.left = self.sortedListToBST(head)
        root.right = self.sortedListToBST(slow.next)
        return root
        """
        def findMiddle(node):
            slow, fast, pre = node, node, None
            while fast and fast.next:
                pre = slow
                slow = slow.next
                fast = fast.next.next
            return pre

        if not head: return None
        nxt = head.next
        if not nxt: return TreeNode(head.val)
        middle = findMiddle(head)
        print(middle.val)
        lnode, middle = middle, middle.next
        rnode = middle.next if middle else None
        lnode.next = None
        root = TreeNode(middle.val)
        root.left = self.sortedListToBST(head)
        root.right = self.sortedListToBST(rnode)

        return root
 def add_node_helper(self, node, val):
     if val<node.data:
         #if left subtree is not None, go to right subtree
         if node.left:
             self.add_node_helper(node.left,val)
         #if left subtree is None, then found the place to insert
         else:
             new_node=TreeNode(val)
             node.left=new_node
             new_node.parent=node
     elif val>node.data:
         #if right subtree is not None, go to right subtree
         if node.right:  
             self.add_node_helper(node.right,val)
         #if right subtree is None, then found the place to insert
         else:
             new_node=TreeNode(val)
             node.right=new_node
             new_node.parent=node
     else:
         print 'Found same value, please check the input!'
         raise IndexError(val)
    def deserialize(self, data):
        """Decodes your encoded data to tree.
        
        :type data: str
        :rtype: TreeNode
        """
        if not data: return None
        nodes = data.split(',')
        root = TreeNode(int(nodes[0]))
        q = deque([root])
        index = 1
        while q:
            node = q.popleft()
            if nodes[index] is not '#':
                node.left = TreeNode(int(nodes[index]))
                q.append(node.left)
            index += 1

            if nodes[index] is not '#':
                node.right = TreeNode(int(nodes[index]))
                q.append(node.right)
            index += 1
        return root
Пример #28
0
    def generateTrees(self, n):
        """
        :type n: int
        :rtype: List[TreeNode]
        """
        if n == 1:
            return [TreeNode(n)]
        ans = []
        subtrees = self.generateTrees(n - 1)

        def copy(root):
            if not root:
                return None
            node = TreeNode(root.val)
            if root.left:
                node.left = copy(root.left)
            if root.right:
                node.right = copy(root.right)
            return node

        #print(n, len(subtrees))
        for st in subtrees:
            # current n as root with subtree as left child
            root = TreeNode(n)
            root.left = copy(st)
            ans.append(root)

            # current n as far right leaf child
            root = copy(st)
            node = root
            while node.right:
                node = node.right
            node.right = TreeNode(n)
            ans.append(root)

            node = st.right
            lev = 1
            while node:
                root = copy(st)
                newnode = root
                cur = 1
                while cur < lev:
                    newnode = newnode.right
                    cur += 1
                newleft = newnode.right
                newnode.right = TreeNode(n)
                newnode.right.left = newleft
                ans.append(root)
                node = node.right
                lev += 1

        return ans
Пример #29
0
def deserialize_bfs(data):
    if data == '': return None
    data = data.split(',')
    queue = [None if num == '#' else TreeNode(int(num)) for num in data]
    front = 0
    index = 1
    root = queue[front]
    while index < len(queue) and front < len(queue):
        curr = queue[front]
        front += 1
        if curr is None: continue

        if index >= len(queue): return root
        curr.left = queue[index]
        index += 1
        if index >= len(queue): return root

        curr.right = queue[index]
        index += 1

    return root
Пример #30
0
 def test_isBalanced(self):
     temp = BinaryTree()
     self.assertEqual(temp.isBalanced(temp.root), True)
     temp.root = TreeNode(10)
     self.assertEqual(temp.isBalanced(temp.root), True)
     temp.initExampleTree()
     self.assertEqual(temp.isBalanced(temp.root), True)
     temp.initLeftLeaningTree()
     self.assertEqual(temp.isBalanced(temp.root), False)
     temp.initRightLeaningTree()
     self.assertEqual(temp.isBalanced(temp.root), False)
     temp.root = TreeNode(1)
     temp.root.leftNode = TreeNode(2)
     temp.root.rightNode = TreeNode(2)
     temp.root.leftNode.leftNode = TreeNode(3)
     temp.root.leftNode.leftNode.leftNode = TreeNode(4)
     self.assertEqual(temp.isBalanced(temp.root), False)
 def constructFromPrePost(self, pre, post):
     """
     :type pre: List[int]
     :type post: List[int]
     :rtype: TreeNode
     """
     if len(pre) == 0: return None
     node = TreeNode(pre[0])
     if len(pre) == 1: return node
     if pre[1] != post[-2]:
         i = post.index(pre[1])
         j = pre.index(post[-2])
         node.left = self.constructFromPrePost(pre[1:j], post[:i + 1])
         node.right = self.constructFromPrePost(pre[j:], post[i + 1:-1])
     else:
         node.left = self.constructFromPrePost(pre[1:], post[:-1])
         node.right = None
     return node
Пример #32
0
 def add_node_helper(self, node, val):
     if val < node.data:
         #if left subtree is not None, go to right subtree
         if node.left:
             self.add_node_helper(node.left, val)
         #if left subtree is None, then found the place to insert
         else:
             new_node = TreeNode(val)
             node.left = new_node
             new_node.parent = node
     elif val > node.data:
         #if right subtree is not None, go to right subtree
         if node.right:
             self.add_node_helper(node.right, val)
         #if right subtree is None, then found the place to insert
         else:
             new_node = TreeNode(val)
             node.right = new_node
             new_node.parent = node
     else:
         print 'Found same value, please check the input!'
         raise IndexError(val)
Пример #33
0
def test():
    node1 = TreeNode(1)
    node2 = TreeNode(2)
    node3 = TreeNode(3)
    node4 = TreeNode(4)
    node5 = TreeNode(5)
    node6 = TreeNode(6)
    node7 = TreeNode(7)

    root = node4
    node4.addLeftChild(node2)
    node2.addLeftChild(node1)
    node2.addRightChild(node3)
    node4.addRightChild(node6)
    node6.addLeftChild(node5)
    node6.addRightChild(node7)

    node8 = TreeNode(8)

    print "Passed" if findCommonAncestorHasParent(node1,
                                                  node3) == node2 else "Failed"
    print "Passed" if findCommonAncestorHasParent(node1,
                                                  node5) == node4 else "Failed"
    print "Passed" if findCommonAncestorHasParent(node1,
                                                  node4) == node4 else "Failed"
    print "Passed" if findCommonAncestorHasParent(node1,
                                                  node8) == None else "Failed"

    print "Passed" if findCommonAncestorWithoutParent(
        root, node1, node3) == node2 else "Failed"
    print "Passed" if findCommonAncestorWithoutParent(
        root, node1, node5) == node4 else "Failed"
    print "Passed" if findCommonAncestorWithoutParent(
        root, node1, node4) == node4 else "Failed"
    print "Passed" if findCommonAncestorWithoutParent(
        root, node1, node8) == None else "Failed"
            return []
        result = []
        
        def FindPathCore(root, path, currentNum):
            currentNum += root.val
            path.append(root)
            flag = (root.left == None and root.right == None)
            if currentNum == expectNum and flag:
                onepath = []
                for node in path:
                    onepath.append(node.val)
                result.append(onepath)
            if currentNum < expectNum:
                if root.left:
                    FindPathCore(root.left, path, currentNum)
                if root.right:
                    FindPathCore(root.right, path, currentNum)
            path.pop()
        
        FindPathCore(root, [], 0)
        return result

if __name__ == "__main__":
    node1 = TreeNode(4)
    node2 = TreeNode(7)
    node3 = TreeNode(5, left=node1, right=node2)
    node4 = TreeNode(12)
    root = TreeNode(10, left=node3, right=node4)
    
    a = Solution()
    print(a.FindPath(root, 22))
Пример #35
0
        return True
    # If one of them is non empty, violates isomorphism
    if not t1 or not t2:
        return False
    # If data in a level are not same; violates isomorphism
    if t1.data != t2.data:
        return False
    else:
        case1 = (is_isomorphic(t1.left_node, t2.left_node) and
                 is_isomorphic(t1.right_node, t2.right_node))
        case2 = (is_isomorphic(t1.left_node, t2.right_node) and
                 is_isomorphic(t1.right_node, t2.left_node))
        return case1 or case2

if __name__ == "__main__":
    bTree1 = TreeNode(1)
    bTree1.left_node = TreeNode(2)
    bTree1.right_node = TreeNode(3)
    bTree1.left_node.left_node = TreeNode(4)
    bTree1.left_node.right_node = TreeNode(5)
    bTree1.right_node.left_node = TreeNode(6)
    bTree1.left_node.right_node.left_node = TreeNode(7)
    bTree1.left_node.right_node.right_node = TreeNode(8)

    bTree2 = TreeNode(1)
    bTree2.left_node = TreeNode(3)
    bTree2.right_node = TreeNode(2)
    bTree2.left_node.right_node = TreeNode(6)
    bTree2.right_node.left_node = TreeNode(4)
    bTree2.right_node.right_node = TreeNode(5)
    bTree2.right_node.right_node.left_node = TreeNode(8)
Пример #36
0
 def __init__(self, e):
     self.height = 0 # New data field
     TreeNode.__init__(self, e)
Пример #37
0
def test():
	node1 = TreeNode(1)
	node2 = TreeNode(2)
	node3 = TreeNode(3)
	node4 = TreeNode(4)
	node5 = TreeNode(5)
	node6 = TreeNode(6)
	node7 = TreeNode(7)

	root = node4
	node4.addLeftChild(node2)
	node2.addLeftChild(node1)
	node2.addRightChild(node3)
	node4.addRightChild(node6)
	node6.addLeftChild(node5)
	node6.addRightChild(node7)

	root.inOrderTraverse()

	print "Passed" if findSuccessor(node1) == node2 else "Failed"
	print "Passed" if findSuccessor(node4) == node5 else "Failed"
	print "Passed" if findSuccessor(node2) == node3 else "Failed"
	print "Passed" if findSuccessor(node3) == node4 else "Failed"
	print "Passed" if findSuccessor(node5) == node6 else "Failed"
	print "Passed" if findSuccessor(node7) == None else "Failed"
Пример #38
0
def test():
	node1 = TreeNode(1)
	node2 = TreeNode(2)
	node3 = TreeNode(3)
	node4 = TreeNode(4)
	node5 = TreeNode(4)
	node6 = TreeNode(1)
	node7 = TreeNode(-1)
	node8 = TreeNode(5)

	root = node4
	node4.addLeftChild(node2)
	node4.addRightChild(node6)
	node2.addLeftChild(node1)
	node2.addRightChild(node3)
	node6.addLeftChild(node5)
	node6.addRightChild(node7)
	node7.addLeftChild(node8)
	node5.addRightChild(TreeNode(5))

	print allPossiblePaths(root, 9)
Пример #39
0
def test():
	a = [1,2,3,4,5]
	root = createBSTWithMinimalHeight(a)
	print "Passed" if isBST(root) else "Failed"

	a = [1,2,6,4,5]
	root = createBSTWithMinimalHeight(a)
	print "Passed" if not isBST(root) else "Failed"

	root = TreeNode(3)
	node2 = TreeNode(2)
	root.left = node2
	node2.right = TreeNode(4)
	root.right = TreeNode(5)
	print "Passed" if not isBST(root) else "Failed"

	root = TreeNode(3)
	node2 = TreeNode(2)
	root.left = node2
	node2.right = TreeNode(3)
	root.right = TreeNode(5)
	print "Passed" if isBST(root) else "Failed"

	root = TreeNode(3)
	root.left = TreeNode(2)
	node5 = TreeNode(5)
	root.right = node5
	node5.left = TreeNode(4)
	print "Passed" if isBST(root) else "Failed"

	root = TreeNode(3)
	root.left = TreeNode(2)
	node5 = TreeNode(5)
	root.right = node5
	node5.left = TreeNode(2)
	print "Passed" if not isBST(root) else "Failed"

	root = TreeNode(3)
	root.left = TreeNode(2)
	node5 = TreeNode(5)
	root.right = node5
	node5.left = TreeNode(3)
	print "Passed" if not isBST(root) else "Failed"
def printSpiral(node, level, flag):
    if not node:
        return
    if level == 0:
        print node.data,
    elif level > 0:
        if flag:
            printSpiral(node.left_node, level - 1, flag)
            printSpiral(node.right_node, level - 1, flag)
        else:
            printSpiral(node.right_node, level - 1, flag)
            printSpiral(node.left_node, level - 1, flag)


if __name__ == "__main__":
    bTree = TreeNode(1)
    bTree.left_node = TreeNode(2)
    bTree.right_node = TreeNode(3)
    bTree.left_node.left_node = TreeNode(4)
    bTree.left_node.right_node = TreeNode(5)
    bTree.right_node.left_node = TreeNode(6)
    bTree.left_node.left_node.left_node = TreeNode(12)

    print "Reverse Level order traversal: ",
    reverseLevelOrderTraversal(bTree)
    print ""
    print "*"*80
    print "Reverse level order using recursion: "
    reverseLevelOrderRecursion(bTree)