The question is that we need to invert a binary tree by a given string.
The most traditional way is that simulating each step by step:
import queue
class TreeNode(object):
def __init__(self, val):
self.val = val
self.left = None
self.right = None
def str2tree(index):
if index <= length:
val = node_list[index - 1]
node = TreeNode(val)
node.left = str2tree(index * 2)
node.right = str2tree(index * 2 + 1)
return node
else:
return None
def tree2str(root):
result = list()
q = queue.Queue()
q.put(root)
while not q.empty():
cur = q.get()
if cur:
result += [cur.val]
q.put(cur.left)
q.put(cur.right)
else:
result += ["#"]
# while result[-1] == "#":
# result.pop()
return result
def invertTree(root):
if not root:
return None
root.left, root.right = invertTree(root.right), invertTree(root.left)
return root
def shortcut(string):
index = 1
result = list()
while string:
result += [string[:index]]
string = string[index:]
index *= 2
return "".join([item[::-1] for item in result])
if __name__ == "__main__":
node_list = "427#369"
length = len(node_list)
root = str2tree(1)
root = invertTree(root)
result = tree2str(root)
print(result)
However, it’s really stupid for contest if you just simulate it. We actually are able to invert segments of the entire string in O(n) time complexity.
def shortcut(string):
index = 1
result = list()
while string:
result += [string[:index]]
string = string[index:]
index *= 2
return "".join([item[::-1] for item in result])