示例#1
0
    def delNodes(self, root: TreeNode, to_delete: list) -> list:
        dic = {v: v for v in to_delete}
        res = []
        if root is None:
            return []

        # sub_dir 代表左子树或右子树(0:左子树; 1:右子树)
        def get_sub(node: TreeNode, parent: TreeNode, sub_dir: int):
            nonlocal dic
            nonlocal res
            k = dic.get(node.val, 0)
            if k > 0:
                if node.left:
                    res.append(node.left)
                    get_sub(node.left, node, 0)
                if node.right:
                    res.append(node.right)
                    get_sub(node.right, node, 1)
                if sub_dir:
                    parent.right = None
                else:
                    parent.left = None
            else:
                if node.left:
                    get_sub(node.left, node, 0)
                if node.right:
                    get_sub(node.right, node, 1)

        head = TreeNode(-1)
        head.left = root
        get_sub(root, head, 0)
        res.append(root)
        return [node for node in res if node.val not in dic]
示例#2
0
def buildTree(treelist):
    # 构建根元素
    tree_dic = {}
    max_len = len(treelist)
    root = 0
    stack = [root]
    root_tree = TreeNode(treelist[root])
    tree_dic[root] = root_tree
    while True:
        poped = stack.pop()
        tree = tree_dic[poped]
        right = poped * 2 + 2
        left = poped * 2 + 1
        if (right < max_len and treelist[right] != None):
            right_tree = TreeNode(treelist[right])
            tree.right = right_tree
            tree_dic[right] = right_tree
            stack.append(right)
        if (left < max_len and treelist[left] != None):
            left_tree = TreeNode(treelist[left])
            tree.left = left_tree
            tree_dic[left] = left_tree
            stack.append(left)
        if (len(stack) == 0):
            break
    return root_tree
示例#3
0
 def increasingBST(self, root: TreeNode) -> TreeNode:
     iter_head = TreeNode(None)
     head = iter_head
     if root.left is not None:
         head = self.build_left_tree(root.left, root)
     if root.right is not None:
         root.right = self.build_right_tree(root.right)
     return head
示例#4
0
 def build_tree(lst: list):
     le = len(lst)
     if le == 0:
         return
     if le == 1:
         return TreeNode(lst[0])
     middle = int(le / 2)
     r = TreeNode(lst[middle])
     r.left = build_tree(lst[0:middle])
     r.right = build_tree(lst[middle + 1:])
     return r
示例#5
0
    def allPossibleFBT(self, N: int):
        Solution.dic.clear()
        if N == 1:
            return [TreeNode(0)]
        if N % 2 == 0:
            return []
        Solution.dic[1] = [TreeNode(0)]

        for i in range(3, N + 1, 2):
            Solution.dic[i] = self.build_tree_list(i)
        return Solution.dic[N]
示例#6
0
    def build_tree_list(self, sub_tree_num):
        sub_tree_num -= 1

        lst = [(i, sub_tree_num - i) for i in range(1, sub_tree_num, 2)]

        ret_lst = []
        for left, right in lst:
            for L in Solution.dic[left]:
                for R in Solution.dic[right]:
                    node = TreeNode(0)
                    node.left = L
                    node.right = R
                    ret_lst.append(node)

        Solution.dic[sub_tree_num + 1] = ret_lst
        return ret_lst
示例#7
0
 def bstFromPreorder(self, preorder: list) -> TreeNode:
     if len(preorder) == 0:
         return None
     left = []
     right = []
     mid = preorder[0]
     for x in preorder[1:]:
         if x < mid:
             left.append(x)
         else:
             right.append(x)
     node = TreeNode(mid)
     if len(left) > 0:
         node.left = self.bstFromPreorder(left)
     if len(right) > 0:
         node.right = self.bstFromPreorder(right)
     return node
示例#8
0
    def invertTree(self, root: TreeNode) -> TreeNode:
        if not root:
            return
        if not root.left and not root.right:
            return root

        root.left, root.right = root.right, root.left
        self.invertTree(root.left)
        self.invertTree(root.right)
        return root
示例#9
0
    def get_subtree(self, node: TreeNode):
        if node is None:
            return 0, None

        t = TreeNode(node.val)
        left_num, left_subtree = self.get_subtree(node.left)
        right_num, right_subtree = self.get_subtree(node.right)

        if left_num > 0 or right_num > 0:
            if left_num > 0:
                t.left = left_subtree
            if right_num > 0:
                t.right = right_subtree
            return 1, t
        else:
            if t.val > 0:
                return 1, t
            else:
                return 0, None
示例#10
0
    def increasingBST(self, root: TreeNode) -> TreeNode:
        head = TreeNode(None)
        pre = head
        current = root
        deq = deque()
        while (True):
            if current is not None:
                deq.append(current)
                current = current.left
            elif len(deq) > 0:
                current = deq.pop()
                node = TreeNode(current.val)
                head.right = node
                head = head.right
                current = current.right
            else:
                break;

        return pre.right
示例#11
0
 def get_sub(node: TreeNode, parent: TreeNode, sub_dir: int):
     nonlocal dic
     nonlocal res
     k = dic.get(node.val, 0)
     if k > 0:
         if node.left:
             res.append(node.left)
             get_sub(node.left, node, 0)
         if node.right:
             res.append(node.right)
             get_sub(node.right, node, 1)
         if sub_dir:
             parent.right = None
         else:
             parent.left = None
     else:
         if node.left:
             get_sub(node.left, node, 0)
         if node.right:
             get_sub(node.right, node, 1)
示例#12
0
    def recoverFromPreorder(self, S: str) -> TreeNode:
        # 先找到第一个-, 有可能不存在
        i = S.find('-')
        if i == -1:
            return TreeNode(int(S))
        else:
            first_num = int(S[:i])
        cur_node = TreeNode(-1)
        root = TreeNode(first_num)
        nodelist = [(root.val, 0, root)]
        word = []
        while i < len(S):
            level = 0
            word.clear()
            while S[i] == '-':
                level += 1
                i += 1
            while i < len(S) and S[i] != '-':
                word.append(S[i])
                i += 1
            num = int(''.join(word))
            nodelist.append((num, level, TreeNode(num)))
        stacks = []
        cur_lever = -1
        for num, level, node in nodelist:
            if level > cur_lever:
                cur_lever = level
                stacks.append((level, node))
                if cur_node.left is None:
                    cur_node.left = node
                    cur_node = cur_node.left
                else:
                    cur_node.right = node
                    cur_node = cur_node.right
                continue
            else:
                while True:
                    cur_lever, cur_node = stacks[-1]
                    if cur_lever + 1 == level:
                        break
                    else:
                        cur_lever, cur_node = stacks.pop()
                        continue
                cur_node.right = node
                cur_node = cur_node.right
                cur_lever = level
                stacks.append((level, node))

        return root
示例#13
0
        def make_tree(left, right):
            root = TreeNode(left[0])
            if len(left) == 1:
                return root

            left_begin_index = right.index(left[1])
            # 中左右遍历的左树
            left_tree = left[1:1 + len(right) - left_begin_index]
            # 中右左遍历的左树
            left_tree_post = right[left_begin_index:]

            # 中左右遍历的右树
            right_tree = left[1 + len(right) - left_begin_index:]
            # 中右左遍历的右树
            right_tree_post = right[1:left_begin_index]

            if len(left_tree) > 0:
                root.left = make_tree(left_tree, left_tree_post)
            if len(right_tree) > 0:
                root.right = make_tree(right_tree, right_tree_post)

            return root
示例#14
0
 def recoverFromPreorder(self, S: str) -> TreeNode:
     stack, i = [], 0
     while i < len(S):
         level, val = 0, ""
         while i < len(S) and S[i] == '-':
             level, i = level + 1, i + 1
         while i < len(S) and S[i] != '-':
             val, i = val + S[i], i + 1
         while len(stack) > level:
             stack.pop()
         node = TreeNode(val)
         if stack and stack[-1].left is None:
             stack[-1].left = node
         elif stack:
             stack[-1].right = node
         stack.append(node)
     return stack[0]
示例#15
0
    def get_sub(self, node: TreeNode, target: int):
        if node.val == target:
            if node.left is None and node.right is None:
                return (None, 1)
            else:
                if node.left:
                    tree, is_need_delete = self.get_sub(node.left, target)
                    if is_need_delete == 1:
                        node.left = None
                    else:
                        node.left = tree

                if node.right:
                    tree, is_need_delete = self.get_sub(node.right, target)
                    if is_need_delete == 1:
                        node.right = None
                    else:
                        node.right = tree

                if node.left is None and node.right is None:
                    return (None, 1)
                else:
                    return (node, 0)
        else:
            if node.left:
                tree, is_need_delete = self.get_sub(node.left, target)
                if is_need_delete == 1:
                    node.left = None
                else:
                    node.left = tree
            if node.right:
                tree, is_need_delete = self.get_sub(node.right, target)
                if is_need_delete == 1:
                    node.right = None
                else:
                    node.right = tree
            return (node, 0)
示例#16
0
class Solution:
    def getTargetCopy(self, original: TreeNode, cloned: TreeNode,
                      target: TreeNode) -> TreeNode:
        v = target.val
        stacks = []
        if cloned:
            stacks.append(cloned)
            while len(stacks) > 0:
                poped = stacks.pop()
                if poped.val == v:
                    return poped
                if poped.right:
                    stacks.append(poped.right)
                if poped.left:
                    stacks.append(poped.left)
        return None


arr = '[1,2,3,4,5,6,7,8,9,10]'
original = stringToTreeNode(arr)
cloned = stringToTreeNode(arr)
target = TreeNode(5)

t1 = datetime.now()
s = Solution()
res = s.getTargetCopy(original, cloned, target)
print(res)
t2 = datetime.now()
print(t2 - t1)