def build_from_traversals(preorder, inorder):
    if not preorder or not inorder:
        return None
    root_val = preorder[0]
    i = inorder.find(root_val)
    root = TreeNode(root_val)
    root.left = build_from_traversals(preorder[1:i + 1], inorder[0:i])
    root.right = build_from_traversals(preorder[i + 1:], inorder[i + 1:])
Example #2
0
 def pruneTree(self, root: TreeNode) -> TreeNode:
     if not root:
         return None
     root.left = self.pruneTree(root.left)
     root.right = self.pruneTree(root.right)
     if root.val == 0 and not root.left and not root.right:
         return None
     return root
def build_from_traversals(preorder, inorder):
    if not preorder or not inorder:
        return None
    root_val = preorder[0]
    i = inorder.find(root_val)
    root = TreeNode(root_val)
    root.left = build_from_traversals(preorder[1:i+1], inorder[0:i])
    root.right = build_from_traversals(preorder[i+1:], inorder[i+1:])
def makeBalancedTree(nums):
  if not nums:
    return None

  midpoint = len(nums) / 2

  node = TreeNode(nums[midpoint])
  node.left = solution(nums[:midpoint])
  node.right = solution(nums[(midpoint + 1):])
  return node
Example #5
0
def create_by_pre_order(values):
    value = values.pop(0)

    if value == 0:
        return None

    node = TreeNode(value=value)
    node.left = create_by_pre_order(values)
    node.right = create_by_pre_order(values)
    return node
Example #6
0
    def deleteNode(self, root: TreeNode, key: int) -> TreeNode:
        """"""
        v_root = TreeNode(-1)
        v_root.right = root
        parent = v_root
        node = root
        while node:
            if node.val == key:
                break
            elif node.val > key:
                node = node.left
            else:
                node = node.right
            parent = node
        if not node:
            return root

        def find_max_from_left(node: TreeNode) -> TreeNode:
            """从BST树节点的左子树中找到值最大的节点"""
            if not node:
                return
            p = node
            node = node.left
            while node and node.right:
                p = node
                node = node.right
            p.right = None
            return node

        def find_min_from_right(node: TreeNode) -> TreeNode:
            """从BST树节点的右子树中找到值最小的节点"""
            if not node:
                return
            p = node
            node = node.right
            while node and node.left:
                p = node
                node = node.left
            p.left = None
            return node

        if node.left:
            max_sub_node = find_max_from_left(node)
            node.val = max_sub_node.val
        elif node.right:
            min_sub_node = find_min_from_right(node)
            node.val = min_sub_node.val
        else:
            if node.val < parent.val:
                parent.left = None
            else:
                parent.right = None
        return v_root.right
def build_coinflip_tree(k, value=""):
    '''
    INPUT: int
    OUTPUT: TreeNode

    Return the root of a binary tree representing all the possible outcomes
    form flipping a coin k times.
    '''
    node = TreeNode(value)
    if k != 0:
        node.left = build_coinflip_tree(k - 1, value + "H")
        node.right = build_coinflip_tree(k - 1, value + "T")
    return node
def build_coinflip_tree(k, value=""):
    '''
    INPUT: int
    OUTPUT: TreeNode

    Return the root of a binary tree representing all the possible outcomes
    form flipping a coin k times.
    '''
    node = TreeNode(value)
    if k != 0:
        node.left = build_coinflip_tree(k - 1, value + "H")
        node.right = build_coinflip_tree(k - 1, value + "T")
    return node
Example #9
0
def build_coinflip_tree(k, value=""):
    """Return the root of a binary tree for flipping coin k times.
    Root represents all the possible outcomes from flipping a coin k times.
    Parameters
    ----------
    int
    Returns
    -------
    TreeNode
    """
    node = TreeNode(value)
    if k != 0:
        node.left = build_coinflip_tree(k - 1, value + "H")
        node.right = build_coinflip_tree(k - 1, value + "T")
    return node
Example #10
0
 def test_basic_relation(self):
   parent = TreeNode(9)
   node = TreeNode(8)
   left = TreeNode(6)
   right = TreeNode(7)
   node.parent = parent
   node.left = left
   node.right = right
   self.assertEqual(id(node.parent), id(parent))
   self.assertEqual(id(node.left), id(left))
   self.assertEqual(id(node.right), id(right))
   self.assertEqual(id(left.parent), id(node))
   self.assertEqual(id(right.parent), id(node))
   self.assertEqual(id(node.parent), id(parent))
   self.assertEqual(id(parent.left), id(node))
   self.assertTrue(parent.key > left.key)
   self.assertTrue(parent > left)
Example #11
0
def create_by_pre_in_order(values1, values2):
    if not values1 or not values2:
        return None

    root_value = values1[0]
    i = 0
    while values2[i] != root_value:
        i += 1

    left_values1 = values1[1:i + 1]
    left_values2 = values2[:i]
    right_values1 = values1[i + 1:]
    right_values2 = values2[i + 1:]
    node = TreeNode(value=root_value)

    node.left = create_by_pre_in_order(left_values1, left_values2)
    node.right = create_by_pre_in_order(right_values1, right_values2)

    return node
Example #12
0
    def from_pre_post(pre: List[int], post: List[int]) -> TreeNode:
        if not pre:
            return None

        root = TreeNode(pre[0])

        # 左右边界判定
        if len(pre) == 1:
            return root

        left_val = pre[1]
        left_count = post.index(left_val) + 1

        root.left = Construct.from_pre_post(pre[1:left_count + 1],
                                            post[0:left_count])
        root.right = Construct.from_pre_post(pre[left_count + 1:],
                                             post[left_count:-1])

        return root
Example #13
0
        return None
    else:
        return TreeNode(flips, build_coinflip_tree(k - 1, flips + 'H'), build_coinflip_tree(k - 1, flips + 'T'))
        # node.left = build_coinflip_tree(node, k-1)
        # node.right = build_coinflip_tree(node, k-1)

if __name__ == '__main__':
    # build a tree
    #     1
    #    / \
    #   2   3
    #  /
    # 4
    t1 = TreeNode(1)
    t1.left = TreeNode(2)
    t1.right = TreeNode(3)
    t1.left.left = TreeNode(4)

    # build a tree
    #     1
    #    / \
    #   2   3
    #  /   /
    # 4   5
    t2 = TreeNode(1)
    t2.left = TreeNode(2)
    t2.right = TreeNode(3)
    t2.left.left = TreeNode(4)
    t2.right.left = TreeNode(5)

    print find_maximum(t1)    # 4
Example #14
0
from node import TreeNode
from dfs import Recursion, NonRecursion
'''
    1
 2     3
4 5   6 7
'''

root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)
root.right.left = TreeNode(6)
root.right.right = TreeNode(7)

print 'DFS Recursion'
dfsRecursion = Recursion()

print 'Pre Order'
dfsRecursion.preOrder(root)

print 'In Order'
dfsRecursion.inOrder(root)

print 'DFS NonRecursion'
dfsNonRecursion = NonRecursion()

print 'Pre Order'
dfsNonRecursion.preOrder(root)
Example #15
0
    '''Return the height of the tree.'''
    if not node:
        return 0
    return 1 + max(get_height(node.left), get_height(node.right))


if __name__ == '__main__':
    # build a tree
    #     1
    #    / \
    #   2   3
    #  /
    # 4
    t1 = TreeNode(1)
    t1.left = TreeNode(2)
    t1.right = TreeNode(3)
    t1.left.left = TreeNode(4)

    # build a tree
    #     1
    #    / \
    #   2   3
    #  /   /
    # 4   5
    t2 = TreeNode(1)
    t2.left = TreeNode(2)
    t2.right = TreeNode(3)
    t2.left.left = TreeNode(4)
    t2.right.left = TreeNode(5)

    print find_maximum(t1)  # 4
Example #16
0
                current = stack.pop()
                if current.right is None or current.right == prev:
                    visit_it(current.val)
                    prev = current
                    current = None
                else:
                    stack.append(current)
                    stack.append(current.right)
                    current = current.right.left
        """


if __name__ == '__main__':
    root = TreeNode(1)
    root.left = TreeNode(2, right=TreeNode(3))
    root.right = TreeNode(4, left=TreeNode(5))
    root.right.left.left = TreeNode(6, right=TreeNode(7, right=TreeNode(8)))
    root.right.left.right = TreeNode(9)

    pre_order_array = []
    RecursiveMode.pre_order(root, lambda x: pre_order_array.append(x))
    assert pre_order_array == [1, 2, 3, 4, 5, 6, 7, 8, 9]

    in_order_array = []
    RecursiveMode.in_order(root, lambda x: in_order_array.append(x))
    assert in_order_array == [2, 3, 1, 6, 7, 8, 5, 9, 4]

    post_order_array = []
    RecursiveMode.post_order(root, lambda x: post_order_array.append(x))
    assert post_order_array == [3, 2, 8, 7, 6, 9, 5, 4, 1]