def upsideDownBinaryTree2(self, root: nd.node) -> nd.node: stack = [(root, False)] tree = [] while stack: node, visited = stack.pop() if visited: tree.append(node.val) else: if node: stack.append((node.right, False)) stack.append((node, True)) stack.append((node.left, False)) tree.reverse() root2 = nd.node(tree.pop()) dq = collections.deque([root2]) while tree: node = dq.popleft() if not node.right: node.right = nd.node(tree.pop()) dq.append(node.right) if tree and not node.left: node.left = nd.node(tree.pop()) dq.append(node.left) return root2
def build_tree1(self): tree = nd.node(4) tree.left = nd.node(2) tree.right = nd.node(5) tree.left.left = nd.node(1) tree.left.right = nd.node(3) return tree
def build_tree2(): tree = nd.node(7) tree.left = nd.node(3) #tree.left.left = nd.node(3) #tree.left.right = nd.node(4) tree.right = nd.node(15) tree.right.left = nd.node(9) tree.right.right = nd.node(20) return tree
def build_sym_tree2(): tree = nd.node(5) tree.left = nd.node(1) #tree.left.left = nd.node(3) #tree.left.right = nd.node(4) tree.right = nd.node(4) tree.right.left = nd.node(3) tree.right.right = nd.node(6) return tree
def build_tree1(self): tree = nd.node(5) tree.left = nd.node(2) tree.right = nd.node(12) tree.left.left = nd.node(1) tree.left.right = nd.node(3) tree.right.left = nd.node(9) tree.right.right = nd.node(21) tree.right.right.left = nd.node(19) tree.right.right.right = nd.node(25) return tree
def array_to_tree(data): data.reverse() root = tree.node(data.pop()) dq = collections.deque() dq.append(root) while data: node = dq.popleft() if not node.left: node.left = tree.node(data.pop()) dq.append(node.left) if data and not node.right: node.right = tree.node(data.pop()) dq.append(node.right) return root
def _deserialize(array): if not array: return None root = None value = array.pop() if value is not None: root = nd.node(value) root.left = _deserialize(array) root.right = _deserialize(array) return root
def deserialize_level(self, data) -> int: data.reverse() root = nd.node(data.pop()) dq = collections.deque([root]) while data: node = dq.popleft() val = data.pop() if val is not None: node.left = nd.node(val) dq.append(node.left) if data: val = data.pop() if val is not None: node.right = nd.node(val) dq.append(node.right) return root
def build_sym_tree(): tree = nd.node(1) tree.left = nd.node(2) tree.left.left = nd.node(3) tree.left.right = nd.node(4) tree.right = nd.node(2) tree.right.left = None #nd.node(4) tree.right.right = nd.node(3) return tree
def build_tree2(self): tree = nd.node(1) tree.right = nd.node(8) return tree
def build_tree(): tree = nd.node(2) tree.left = nd.node(1) tree.right = nd.node(3) return tree
def insert(self, value): if not self.tree: self.tree = nd.node(value) else: self.tree.insert_level(value)
def test_2(self): self.assertEqual( 5, self.lowestCommonAncestor( hlp.array_to_tree([3, 5, 1, 6, 2, 0, 8, None, None, 7, 4]), nd.node(5), nd.node(4)))
def test_2(self): self.assertEqual(nd.node(1), self.deserialize([1, 2, 3, None, None, 4, 5]))
def build_sym_tree3(): tree = nd.node(5) return tree
def test_2(self): self.assertEqual( 2, self.lowestCommonAncestor( hlp.array_to_tree([6, 2, 8, 0, 4, 7, 9, None, None, 3, 5]), nd.node(2), nd.node(4)))