Пример #1
0
    def deleteNode(self, root: TreeNode, key: int) -> TreeNode:
        if not root:
            return None
        if root.val != key:
            if root.left:
                left = self.deleteNode(root.left, key)
                root.left = left
            if root.right:
                right = self.deleteNode(root.right, key)
                root.right = right
            return root

        else:
            if root.left:
                left = root.left

                if left and not left.left and left.right:
                    left_right = left.right
                    left.right = self.deleteNode(left_right, left_right.val)
                    left_right.left = left
                    left_right.right = root.right
                    return left_right

                real_left = self.deleteNode(root.left, root.left.val)
                right = root.right
                left.left = real_left
                left.right = right
                return left

            if root.right:
                return root.right

            return None
Пример #2
0
    def mirrorTree(self, root: TreeNode) -> TreeNode:
        if not root:
            return None

        left = self.mirrorTree(root.left)
        right = self.mirrorTree(root.right)
        root.left = right
        root.right = left
        return root
Пример #3
0
 def back(self, preorder, pre_begin, pre_end, inorder, in_begin, in_end):
     node = TreeNode(preorder[pre_begin])
     if self.pos_in[preorder[pre_begin]] != in_begin:
         left = self.back(preorder, pre_begin + 1, pre_begin + self.pos_in[preorder[pre_begin]] - in_begin,
                          inorder, in_begin, self.pos_in[preorder[pre_begin]] - 1)
         node.left = left
     if self.pos_in[preorder[pre_begin]] != in_end:
         right = self.back(preorder, pre_begin + self.pos_in[preorder[pre_begin]] - in_begin + 1, pre_end,
                           inorder, self.pos_in[preorder[pre_begin]] + 1, in_end)
         node.right = right
     return node
 def back(self, inorder, in_begin, in_end, postorder, post_begin, post_end):
     node = TreeNode(postorder[post_end])
     if self.pos_in[node.val] != in_begin:
         left = self.back(inorder, in_begin, self.pos_in[node.val] - 1,
                          postorder, post_begin,
                          post_begin + self.pos_in[node.val] - in_begin - 1)
         node.left = left
     if self.pos_in[node.val] != in_end:
         right = self.back(inorder, self.pos_in[node.val] + 1, in_end,
                           postorder,
                           post_begin + self.pos_in[node.val] - in_begin,
                           post_end - 1)
         node.right = right
     return node
    def recoverFromPreorder(self, S: str) -> TreeNode:
        depths = {}
        depth = 0

        index = 0
        while index < len(S):
            while S[index] == '-':
                depth += 1
                index += 1
            start_index = index
            while index < len(S) and S[index] != '-':
                index += 1

            val = int(S[start_index: index])
            node = TreeNode(val)

            temp_list = depths.get(depth, [])
            temp_list.append(node)
            depths[depth] = temp_list

            # print(depth, depths)

            if depth != 0:
                father = depths[depth - 1][-1]
                if father.left:
                    father.right = node
                else:
                    father.left = node
            depth = 0

        return depths[0][0]
Пример #6
0
        def make_tree(node):
            if not node.next:
                return TreeNode(node.val)

            slow, fast, slow_slow = node, node, node
            while fast.next and fast.next.next:
                slow_slow = slow
                slow = slow.next
                fast = fast.next.next

            current = TreeNode(slow_slow.next.val)
            if slow_slow.next.next:
                right = make_tree(slow_slow.next.next)
                current.right = right
            slow_slow.next = None
            left = make_tree(node)
            current.left = left
            return current
Пример #7
0
    def dfs(self, start, end):

        if start > end:
            return [None]

        result = []
        for i in range(start, end + 1):
            lefts = self.dfs(start, i - 1)
            rights = self.dfs(i + 1, end)

            for left in lefts:
                for right in rights:
                    node = TreeNode(i)
                    node.left = left
                    node.right = right
                    result.append(node)

        return result
Пример #8
0
    def back(self, root: TreeNode):
        if not root.right and not root.left:
            root.val = max(root.val, self.null)
            return

        if root.left:
            self.back(root.left)
        if root.right:
            self.back(root.right)

        temp = self.null

        left_son = self.null
        if root.left and root.left.left:
            left_son = max(left_son, left_son + root.left.left.val)
        if root.left and root.left.right:
            left_son = max(left_son, left_son + root.left.right.val)

        right_son = self.null
        if root.right and root.right.left:
            right_son = max(right_son, right_son + root.right.left.val)
        if root.right and root.right.right:
            right_son = max(right_son, right_son + root.right.right.val)

        # 1.l+r 2. l 3. r
        if root.left or root.right:
            if root.left:
                temp = max(temp, root.left.val)
            if root.right:
                temp = max(temp, root.right.val)
            if root.left and root.right:
                temp = max(temp, root.left.val + root.right.val)

        if root.left and right_son != self.null:
            temp = max(temp, root.left.val + right_son)
        if root.right and left_son != self.null:
            temp = max(temp, root.right.val + left_son)

        if left_son != self.null or right_son != self.null:
            temp = max(temp, left_son + right_son + root.val)

        root.val = temp
        if temp > self.ans:
            self.ans = temp
Пример #9
0
    def deleteNode(self, root: TreeNode, key: int) -> TreeNode:
        if not root:
            return None
        if key == root.val:
            if not root.right and not root.left:
                return None
            if root.right:
                successor = root.right
                while successor.left:
                    successor = successor.left
                root.val = successor.val
                root.right = self.deleteNode(root.right, root.val)
                return root
            if not root.right and root.left:
                predecessor = root.left
                while predecessor.right:
                    predecessor = predecessor.right
                root.val = predecessor.val
                root.left = self.deleteNode(root.left, root.val)
                return root

        if key > root.val:
            root.right = self.deleteNode(root.right, key)
            return root
        if key < root.val:
            root.left = self.deleteNode(root.left, key)
            return root
 def deserialize(self, data):
     """Decodes your encoded data to tree.
     1,2,3
     1,2,3
     :type data: str
     :rtype: TreeNode
     """
     data = data[1:len(data) - 1]
     nodes = []
     nums = data.split(',')
     for i in range(len(nums)):
         temp = nums[i].strip()
         if temp != 'None':
             node = TreeNode(int(temp))
             father_index = int((i + 1) / 2) - 1
             if father_index != -1:
                 if (i + 1) % 2 == 0:
                     nodes[father_index].left = node
                 else:
                     nodes[father_index].right = node
             nodes.append(node)
         else:
             nodes.append(None)
     return nodes[0]