def convert(self, tokens):
     stack = []
     for token in tokens:
         if token in self.OPERANDS:
             operands_count = self.OPERANDS.get(token)
             node = TreeNode(token)
             if operands_count == 1:
                 node.left = stack.pop()
             else:
                 node.right = stack.pop()
                 node.left = stack.pop()
             stack.append(node)
         else:
             stack.append(TreeNode(token))
     return node
def main():
    solver = Solution()

    root = TreeNode(1)
    root.left = TreeNode(2)
    root.left.left = TreeNode(3)
    print(solver.maxPathSum(root))
Esempio n. 3
0
def operate_tn(op, l, r):
    if op == ":":  #':' operator adds the length of branch (and create node if no node exists)
        if isinstance(l, TreeNode):
            l.length = float(r)
            return l
        else:
            nod = TreeNode(name=[l], length=float(
                r))  #added [] 18/10/13...to give all tip names as node.name
            return nod

    elif op == ",":  #',' operator creat a subtree from 2 nodes
        if not isinstance(l, TreeNode):
            l = TreeNode(name=[
                l
            ])  #added [] 18/10/13...to give all tip names as node.name

        if not isinstance(r, TreeNode):
            r = TreeNode(name=[
                r
            ])  #added [] 18/10/13...to give all tip names as node.name

        nod = TreeNode(
            name=l.name + r.name
        )  #added [] 18/10/13...to give all tip names as node.name. need refactoring.
        l.parent = nod
        r.parent = nod
        nod.left, nod.right = l, r

        return nod
Esempio n. 4
0
def merge_two_trees_dfs(root1: TreeNode, root2: TreeNode) -> TreeNode:
    """ DFS / Recursion

    We can traverse the two trees from root node at the same time using DFS, 
    and merge corresponding nodes. There are three cases:
    1. Both of the two nodes are empty, then the merged one will be empty as 
    well.
    2. If there is only one node is empty, then the non-empty node will be 
    the merged node.
    3. If both nodes are non-empty, then we shall calculate the sum of the 
    two nodes' values to merge them. 

    Time Complexity - O(min(M, N)) - M, N are the number of nodes for the 
    two trees. 
    Space Complexity - O(1) - If operating on the original tree such as 
    root1, then it's constant, otherwise, O(min(M,N)). 
    """
    # Edge cases, rooot1 or root2 is None.
    if not root1: return root2
    if not root2: return root1

    # Otherwise, root1 and root2 both exist, update the value and dive into
    # left and right node. After the two edge cases, it's equivalent to
    # if root1 and root2:
    root1.val += root2.val
    root1.left = merge_two_trees_dfs(root1.left, root2.left)
    root1.right = merge_two_trees_dfs(root1.right, root2.right)

    return root1
Esempio n. 5
0
 def mergeTrees(self, t1: TreeNode, t2: TreeNode) -> TreeNode:
     if not t1 or not t2:
         return t1 or t2
     t1.val = t1.val + t2.val
     t1.left = self.mergeTrees(t1.left, t2.left)
     t1.right = self.mergeTrees(t1.right, t2.right)
     return t1
Esempio n. 6
0
 def doit():
     val = next(vals)
     if val == '#':
         return None
     node = TreeNode(int(val))
     node.left = doit()
     node.right = doit()
     return node
Esempio n. 7
0
def tree_build_left_linked_list(data):
    if data:
        node = TreeNode(data[0])
        next_node = tree_build_left_linked_list(data[1:])
        node.left = next_node
        return node
    else:
        return None
Esempio n. 8
0
 def buildTree(self, preorder, inorder) -> TreeNode:
     if not preorder or not inorder:
         return
     root = TreeNode(preorder[0])  #先根
     idx = inorder.index(preorder[0])  #中
     root.left = self.buildTree(preorder[1:1 + idx], inorder[:idx])
     root.right = self.buildTree(preorder[1 + idx:], inorder[idx + 1:])
     return root
Esempio n. 9
0
def sorted_list_to_tree(numbers):
    middle = len(numbers) // 2
    root = None
    if middle >= 0 and middle < len(numbers):
        root = TreeNode(numbers[middle])
        root.left = sorted_list_to_tree(numbers[0:middle])
        root.right = sorted_list_to_tree(numbers[middle+1:])
    return root
def create_tree(array, start, end):
    if end < start:
        return None
    mid = int((start + end) / 2)
    mid_node = TreeNode(array[mid])
    mid_node.left = create_tree(array, start, mid - 1)
    mid_node.right = create_tree(array, mid + 1, end)
    return mid_node
    def test_minimal_tree_simple(self):
        expected = TreeNode(2)
        expected.left = TreeNode(1)
        expected.right = TreeNode(3)

        self.assertEqual(
            minimal_tree([1, 2, 3]),
            expected
        )
def build_tree(preorder, inorder):
    if not inorder:
        return None
    root_val = preorder.pop(0)
    idx = inorder.index(root_val)
    root = TreeNode(root_val)
    root.left = build_tree(preorder, inorder[:idx])
    root.right = build_tree(preorder, inorder[idx + 1:])
    return root
def main():
    root = TreeNode(12)
    root.left = TreeNode(7)
    root.right = TreeNode(1)
    root.left.left = TreeNode(9)
    root.right.left = TreeNode(10)
    root.right.right = TreeNode(5)
    print(print_path(find_paths(root, 23)))
    print(print_path(find_paths(root, 16)))
Esempio n. 14
0
    def build(start, end):
        if end < start:
            return

        mid = math.ceil((end - start) / 2) + start

        root = TreeNode(input[mid])
        root.left = build(start, mid - 1)
        root.right = build(mid + 1, end)
        return root
Esempio n. 15
0
 def buildTreeR(self, inorder, postorder):
     """ Recursive"""
     if not inorder or not postorder:
         return None
     root = TreeNode(postorder.pop())
     index = inorder.index(root.val)
     # Its right first, as the pop order is postorder - root, right, left
     root.right = self.buildTree(inorder[index + 1:], postorder)
     root.left = self.buildTree(inorder[:index], postorder)
     return root
Esempio n. 16
0
    def buildHelper(self, preorder, inorder):
        if not preorder or not inorder:
            return None

        root = TreeNode(preorder.popleft())
        index = inorder.index(root.val)

        root.left = self.buildHelper(preorder, inorder[:index])
        root.right = self.buildHelper(preorder, inorder[index + 1:])
        return root
 def dfs(dq):
     if not dq:
         return None
     node = dq.popleft()
     if node == '#':
         return None
     root = TreeNode(int(node))
     root.left = dfs(dq)
     root.right = dfs(dq)
     return root
Esempio n. 18
0
def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
    if not preorder or not inorder:
        return
    rootVal = preorder.pop(0)
    root = TreeNode(rootVal)
    index = inorder.index(rootVal)
    leftIn = inorder[:index]
    rightIn = inorder[index + 1:]
    root.left = self.buildTree(preorder, leftIn)
    root.right = self.buildTree(preorder, rightIn)
    return root
        def trim(node: TreeNode):
            if not node:
                return None
            if node.val < low:
                return trim(node.right)
            if node.val > high:
                return trim(node.left)

            node.left = trim(node.left)
            node.right = trim(node.right)
            return node
Esempio n. 20
0
def tree_build_left_linked_list(data):
    if data:
        # similar to building a linked list just .next is replaced with .left. If there
        # are any elements we create a node with the first value then set its child to
        # the return of this fuction without the first value
        node = TreeNode(data[0])
        next_node = tree_build_left_linked_list(data[1:])
        node.left = next_node
        return node
    else:
        return None
Esempio n. 21
0
def build_bracket_tree(bracket_depth, players):
    new_node = TreeNode()
    if bracket_depth == 1:
        new_node.player_one = players.pop()
        new_node.player_two = players.pop()
    # TODO(ericslchiang): Fix seeding later, for now fill in order

    else:
        new_node.left = build_bracket_tree(bracket_depth - 1, players)
        new_node.right = build_bracket_tree(bracket_depth - 1, players)

    return new_node
Esempio n. 22
0
    def train(self, data, labels, remaining_depth=None, k=None):
        """
        Grows a decision tree by constructing nodes. Greedily sets split rules for each node by maximizing
        information gain.

        Stops growing (either when no training datapoints are left to separate or when max depth is reached)
        and inserts a leaf node.

        Stores the root node of the resulting tree to use as a starting point for classification later.

        Parameters
        ----------
        data : np.array
            An (n, d) numpy matrix with numerical (float or int) entries. Each row represents a datapoint.
        labels : np.array
            An (n,) numpy array. Each entry represents the label for its corresponding datapoint.
        remaining_depth : int, optional
            The number of children that can be created underneath nodes at this level of recursion.
            Should be None on the first call.
        k : int, optional
            The number of possible labels. If set to None, the first call to this function will assign it.
            TODO: change the assumption that labels only take on values 0, 1, ..., k - 1.
        """

        node = TreeNode(None, None, None, None)

        if remaining_depth is None:
            # Bookkeeping for first call
            if k is None:
                k = np.max(labels) + 1
            remaining_depth = self.max_depth
            self.root_node = node
            self.set_possible_threshold_values(data)

        if remaining_depth > 0:
            # Non-leaf case
            node.split_rule = self.find_best_split_rule(data, labels)

            left_data, left_labels, right_data, right_labels = self.split_data_and_labels(
                data, labels, node.split_rule)

            if len(left_data) == 0 or len(right_data) == 0:
                # If there would be no more data to split in one of the child nodes, make a leaf
                node.convert_to_leaf(labels, k)
            else:
                node.left = self.train(left_data, left_labels, remaining_depth - 1, k)
                node.right = self.train(right_data, right_labels, remaining_depth - 1, k)

        else:
            # If we've reached our max depth, make a the node a leaf
            node.convert_to_leaf(labels, k)
        return node
Esempio n. 23
0
 def _reassign(self, parent: TreeNode, node: Inode,
               new_node: TreeNode) -> None:
     """
     Mutate the value of a child node, given parent node, child node and its new value
     Note: parent can be Empty, in the case that node in root
     """
     if (isinstance(parent, Empty)):
         self.root = new_node
     else:
         if self._is_right(node, parent):
             parent.right = new_node
         else:
             parent.left = new_node
Esempio n. 24
0
 def buildTree(self, preorder, inorder):
     """
     :type preorder: List[int]
     :type inorder: List[int]
     :rtype: TreeNode
     """
     if not inorder:
         return None
     root_val = preorder[0]
     root = TreeNode(root_val)
     mid = inorder.index(root_val)
     root.left = self.buildTree(preorder[1:mid + 1], inorder[:mid])
     root.right = self.buildTree(preorder[mid + 1:], inorder[mid + 1:])
     return root
Esempio n. 25
0
        def make_tree(start_index, end_index):  # 只和长度有关
            # 首先判定我们的区间是否合理,即left_index要<=right_index
            # 当相等时,只有root会产生,不会产生左右小树
            if start_index > end_index:
                return None

            # 我这里变量名都写得比较长,目的是方便理解
            mid_index = (start_index + end_index) // 2
            this_tree_root = TreeNode(nums[mid_index])  # 做一个小树的root

            this_tree_root.left = make_tree(start_index, mid_index - 1)
            this_tree_root.right = make_tree(mid_index + 1, end_index)

            return this_tree_root  # 做好的小树
def rebuilt_binary_tree(pre, ino):
    """前序遍历和中序遍历确定二叉树"""
    if not pre and not ino:
        return None
    
    root = TreeNode(pre[0])

    if set(pre) != set(ino):
        return None
    
    i = ino.index(pre[0])
    root.left = rebuilt_binary_tree(pre[1:i+1], ino[:i])
    root.right = rebuilt_binary_tree(pre[i+1:], ino[i+1:])

    return root
    def deserialize(self, s):
        """前序遍历序列转化为二叉树"""
        self.flag += 1
        l = s.split(',')

        if self.flag >= len(s):
            return None

        root = None

        if l[self.flag] != '#':
            root = TreeNode(int(l[self.flag]))
            root.left = self.deserialize(s)
            root.right = self.deserialize(s)

        return root
Esempio n. 28
0
 def _recurs_insert(self, node: TreeNode, data: any) -> bool:
     if node.value == data:
         return False
     if data > node.value:
         if isinstance(node.right, Empty):
             node.right = Inode(data)
             return True
         else:
             return self._recurs_insert(node.right, data)
     elif data < node.value:
         if isinstance(node.left, Empty):
             node.left = Inode(data)
             return True
         else:
             return self._recurs_insert(node.left, data)
     return False
        def dp(nums: List[int]) -> List[Optional[TreeNode]]:
            if len(nums) == 0:
                return [None]
            if len(nums) == 1:
                return [TreeNode(nums[0])]
            ret = []
            for i in range(len(nums)):
                left_list = dp(nums[:i])
                right_list = dp(nums[i + 1:])
                for left, right in itertools.product(left_list, right_list):
                    root = TreeNode(nums[i])
                    root.left = left
                    root.right = right
                    ret.append(root)

            return ret
Esempio n. 30
0
def buildTree(preorder, inorder):
    """
  :type preorder: List[int]
  :type inorder: List[int]
  :rtype: TreeNode
  """
    if len(preorder) == 0 and len(inorder) == 0:
        return None
    root = TreeNode(preorder[0])
    root_ind = inorder.index(preorder[0])
    left_inorder = inorder[:root_ind]
    right_inorder = inorder[root_ind + 1:]
    left_preorder = [i for i in preorder if i in left_inorder]
    right_preorder = [i for i in preorder if i in right_inorder]
    root.left = buildTree(left_preorder, left_inorder)
    root.right = buildTree(right_preorder, right_inorder)
    return root
Esempio n. 31
0
def deserialize_tree(tree_data : list):
    """
    Decodes your encoded data to tree.
    
    :type data: list
    :rtype: TreeNode
    """

    value = tree_data.pop(0)
    if value == [None]:
        return None

    root = TreeNode()
    root.val = value
    root.left = deserialize_tree(tree_data)
    root.right = deserialize_tree(tree_data)

    return root
Esempio n. 32
0
                    q.put(current.left)
                if current.right != None:
                    q.put(current.right)
        return list

s = Solution()
t1 = TreeNode(1)
t2 = TreeNode(2)
t3 = TreeNode(3)
t4 = TreeNode(4)
t5 = TreeNode(5)
t6 = TreeNode(6)
t7 = TreeNode(7)


t1.left = t2
t1.right = t3
t2.left = t4
t2.right = t5
t3.left = t6
t3.right = t7

level_order_list = s.levelOrder(t1)
for node in level_order_list:
    print(node, end=" ")